我正在考虑设置如下所示。将有一个管理员可以访问并且工作人员可以访问的登录页面。管理员可以使其成为工人可以看到某些数据(管理员可以创建工作人员)。现在的主要问题是用护照挂钩。我认为用户文档看起来像这样
{username: "user1", password : "pass1", role : "admin",
workers :[
{username : "worker1", password : "workerpass1"},
{username : "worker2", password : "workerpass2"}]
}
Passport会执行以下操作来检查用户名和密码
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function(err, user) {
........................
我想知道如何访问工作级别,因为我认为上面的护照代码会查看顶部的用户名字段。
我想我想做这样的事情:如果在登录尝试时,如果用户名密码不在顶级,请转到workers数组并测试用户名和密码是否匹配
如果User.findOne
找不到用户User.worker.findOne()
,我该怎么办呢?
答案 0 :(得分:0)
如果您正在寻找与之匹配的任何组合,那么您基本上需要$or
查询条件,并使用$elemMatch
来获取username
和password
组合特定的workers
条目:
passport.use(new LocalStrategy(
function(username,password,done) {
User.findOne({
"$or": [
{ "username": username, "password": password },
{
"workers": { "$elemMatch": {
"username": username, "password": password
}}
}
]
},function(err,user) {
// remaining code
});
}
))
这意味着"要么" $or
数组中列出的条件可以匹配文档,而$elemMatch
用于确保" username"和#34;密码"需要匹配数组元素,如果主要" userame"和#34;密码"在阵列之外不是匹配。
所以它的"或/或",并且阵列的检查发生在"内部"查询方法,而不是直接作为模型对象的属性。
此处还注意到,因为"用户名"和#34;密码"可能"也"在数组对象中,其他内置验证方法需要在此处由查询逻辑覆盖。所以"查询"需要验证匹配,并在返回一个对象时返回一个"有效的"结果
这是定制的成本。否则,只需拥有单独的用户帐户,所有帐户都具有您想要应用的相同角色。