我正在尝试更新用户的角色,但每次我想提供/删除管理员角色(全局角色)时,它告诉我我不能混合使用它们。我不知道如何解决这个问题。
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');
}
如何解决这个问题?
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);