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方法。
没有完美的解决方案,因为:
- 没有服务器端流星回调post完成帐户创建。
- 在
onCreateUser
中,用户尚未添加到集合中。
Accounts.createUser
的回调目前只在客户端使用。然后可以从该回调中使用一个方法,但依赖它是不安全的。
- 角色包似乎从集合中获取用户,但在
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])
}
});
我正在使用 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方法。
没有完美的解决方案,因为:
- 没有服务器端流星回调post完成帐户创建。
- 在
onCreateUser
中,用户尚未添加到集合中。 Accounts.createUser
的回调目前只在客户端使用。然后可以从该回调中使用一个方法,但依赖它是不安全的。
- 在
- 角色包似乎从集合中获取用户,但在
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])
}
});