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 中为不同组中的用户添加不同的角色?