Meteor:如何在注册过程中为用户分配不同的角色

Posted

技术标签:

【中文标题】Meteor:如何在注册过程中为用户分配不同的角色【英文标题】:Meteor: How to assign different roles to users during sign up process 【发布时间】:2015-08-09 13:25:59 【问题描述】:

我使用流星包ian:accounts-ui-bootstrap-3 用于帐户,alanning:roles 用于分配角色。

在注册表单上,我有两种选择,一种用于Doctor,另一种用于Advisor。我想将所选选项作为角色分配给该用户。有人可以告诉我该怎么做吗?

我刚开始学习流星,对它的流向不太了解。如果我像这样手动创建用户,我可以为用户分配角色:

var adminUser = Meteor.users.findOne(roles:$in:["admin"]);

if(!adminUser)

    adminUser = Accounts.createUser(
      email: "mohsin.rafi@mail.com",
      password: "admin",
      profile:  name: "admin" 
    );
    Roles.addUsersToRoles(adminUser, [ROLES.Admin]);
 

但我想在用户注册并选择其中一个选项时自动分配卷,并且该选项应分配为他的角色。

【问题讨论】:

只是关于使用配置文件的一句话。这似乎不是一个好主意:请参阅guide.meteor.com/accounts.html中的“不要使用个人资料” 【参考方案1】:

你不应该为此需要破解。您可以使用Meteor.users 集合上的以下钩子来代替使用Accounts.onCreateUser。类似于以下内容的东西应该可以工作:

Meteor.users.after.insert(function (userId, doc) 
    if (doc.profile.type === "doctor") 
        Roles.addUsersToRoles(doc._id, [ROLES.Doctor])
     else if (doc.profile.type === "advisor") 
        Roles.addUsersToRoles(doc._id, [ROLES.Advisor])
    
);

【讨论】:

谢谢!为我工作! 可能需要注意的是,您需要meteor add matb33:collection-hooks【参考方案2】:

为了避免每次都检查登录,可以直接在用户对象上设置角色,而不是使用角色 API。

黑客?是的,您可能需要确保角色已经添加到角色中...不确定是否还有其他内容。

if(Meteor.isServer)
  Accounts.onCreateUser(function(options, user)
    if(options.roles)
      _.set(user, 'roles.__global_roles__', ['coach', options.roles]);
    
    return user;
  );

注意:_.set 是一个 lodash 方法,不在 underscorejs 中。

没有完美的解决方案,因为:

    没有服务器端流星回调后完成帐户创建。 在onCreateUser 中,用户尚未添加到集合中。 Accounts.createUser 的回调目前仅用于客户端。然后可以从该回调中使用一个方法,但依赖它是不安全的。 角色包似乎从集合中获取了用户,而在 onCreateUser 中它还没有。

【讨论】:

【参考方案3】:

您可以使用Accounts.onCreateUser 挂钩来管理它。

请记住,下面的代码相当不安全,您可能需要事先进行更多检查,否则任何人都可以指定自己为管理员。 (来自文档):

选项可能来自不受信任的客户端,因此请确保验证您从中读取的任何值。

Accounts.onCreateUser(function (options, user) 
  user.profile = options.profile || ;
  if (_.has(options, 'role')) 
    Roles.addUserToRoles(user._id, options.role);
  
  return user;
);

【讨论】:

感谢您的帮助。我尝试了您的代码,但我没有在“选项”中获得“角色”。我做了 console.log(options) 并且那里没有角色字段,这可能是它没有添加角色的原因。在 mongo 上,当我执行“db.users.find()”时,它也没有显示角色字段。但是当我使用“Accounts.onLogin”时,我分享我的代码低于它的工作完美。但我希望它适用于“Accounts.onCreateUser”。 Roles.addUserToRoles 将无法在 onCreateUser 中工作,因为尚未将新用户添加到 Meteor.users 集合中,即使有一个 user._id 将用于这样做。 【参考方案4】:

感谢您的回复。我试过了,但它对我不起作用。

我使用Accounts.onLogin 钩子来管理这个。下面的代码对我有用:

Accounts.onLogin(function (info) 
    var user = info.user;
    if(user.profile.type === "doctor")
      Roles.addUsersToRoles(user, [ROLES.Doctor])
    
    else 
      if(user.profile.type === "advisor")
        Roles.addUsersToRoles(user, [ROLES.Advisor])
        
    return user;
  );

【讨论】:

这非常低效,因为每次登录至少要进行一次额外的数据库查询。 @corvid 的回答有什么问题? 是的,你是对的。我尝试了@corvid 的代码,但不知道为什么这对我不起作用。运行他的代码后,我没有为用户分配任何角色。

以上是关于Meteor:如何在注册过程中为用户分配不同的角色的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中为 1 个路由分配 2 个或多个用户角色?

我如何在 laravel 中为 spatie 包(ACL 管理)中的其他角色分配用户列表权限?

是否可以在 keycloak 中为不同组中的用户添加不同的角色?

在 mongoose 中为用户分配角色

使用用户 SPI 在 Keycloak 中为外部用户分配角色

导轨 4 |使用位掩码在表单中为用户分配角色 |榜样