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

Meteor: How to assign different roles to users during sign up process

我正在使用 meteor 包 ian:accounts-ui-bootstrap-3 for accounts and alanning:roles 分配角色。

在注册表单上,我有两个选项,一个用于 Doctor,另一个用于 Advisor。我想将 selected 选项作为角色分配给该用户。谁能告诉我该怎么做?

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

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

但我想在用户注册时自动分配一个角色,select其中一个选项应该分配给他的角色。

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

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

options may come from an untrusted client so make sure to validate any values you read from it.

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

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

我使用 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;
  });

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

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

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

注意:_.set是underscorejs中没有的lodash方法。

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

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

你不应该为此需要黑客。您可以使用 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])
    }
});