代码之家  ›  专栏  ›  技术社区  ›  P. Nick

Meteor角色:不能混合分组和非分组角色

  •  1
  • P. Nick  · 技术社区  · 6 年前

    我正在尝试为用户更新角色,但每次我想赋予/删除管理员角色(全局角色)时,它都会告诉我不能混合使用它们。我不知道如何解决这个问题。

    Meteor.users.update(id, {
        $set: {
            'username': username,
            'emails.0.address': email
        }
    });
    
    if(Roles.userIsInRole(id, ['mod'])) {
        Roles.removeUsersFromRoles(id, 'mod');
    }
    
    if(Roles.userIsInRole(id, ['admin'])) {
        Roles.removeUsersFromRoles(id, 'admin');
    }
    
    if(role == 'Moderator') {
        Roles.addUsersToRoles(id, 'mod');
    } else if(role == 'Administrator') {
        Roles.addUsersToRoles(id, 'admin');
    }
    

    如何修复此问题?

    1 回复  |  直到 6 年前
        1
  •  4
  •   coagmano    6 年前

    tl;博士

    您必须向全局组分配角色,如下所示:

    Roles.addUsersToRoles(id, 'admin', Roles.GLOBAL_GROUP);
    

    详细信息:

    当为用户分配了有组和无组的角色时,会发生此错误。正如文件所说:

    注意:如果您为任何用户使用组,则应为所有用户使用组。这是由于roles包如何在数据库内部存储角色。

    具体而言(从文件中):

    Roles.addUsersToRoles(bobsUserId, ['manage-team','schedule-game'])
    // internal representation - no groups
    // user.roles = ['manage-team','schedule-game']
    
    Roles.addUsersToRoles(joesUserId, ['manage-team','schedule-game'], 'manchester-united.com')
    Roles.addUsersToRoles(joesUserId, ['player','goalie'], 'real-madrid.com')
    // internal representation - groups
    // NOTE: MongoDB uses periods to represent hierarchy so periods in group names
    //   are converted to underscores.
    //
    // user.roles = {
    //   'manchester-united_com': ['manage-team','schedule-game'],
    //   'real-madrid_com': ['player','goalie']
    // }
    

    将组分配给用户,将角色属性从数组转换为对象,以后的更改必须指定组。

    要分配全局角色,必须指定全局组,如下所示:

    角色。addUsersToRoles(id,“admin”,Roles.GLOBAL\u GROUP);