流星角色:无法混合分组和非分组角色

时间:2018-04-10 19:58:45

标签: javascript meteor

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

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 个答案:

答案 0 :(得分:4)

TL;博士

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

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

详情:

当为用户分配了具有组且没有组的角色时,会发生该错误。正如文档所说:

  

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

具体(来自文档):

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']
// }

将一个组分配给用户,将roles属性从一个数组转换为一个对象,然后将来的更改必须指定一个组。

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

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