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

时间:2015-05-27 12:42:57

标签: meteor meteor-accounts

我正在使用meteor软件包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]);
 }

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

4 个答案:

答案 0 :(得分:5)

你不应该为此而烦恼。您可以使用Accounts.onCreateUser集合上的以下挂钩来代替使用Meteor.users。以下内容应该有效:

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])
    }
});

答案 1 :(得分:1)

每次可以直接在用户对象上设置角色而不是使用Roles 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中。

没有漂亮的解决方案,因为:

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

答案 2 :(得分:-1)

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

请记住下面的代码相当不安全,您可能希望事先进行更多检查,否则任何人都可以为自己分配管理员。 (来自docs):

  

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

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

答案 3 :(得分:-1)

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

我使用Accounts.onLogin hook来管理它。下面的代码适用于我:

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;
  });