如果“父”文档没有任何匹配的用户名和密码,则护照匹配子文档中的用户名和密码
Posted
技术标签:
【中文标题】如果“父”文档没有任何匹配的用户名和密码,则护照匹配子文档中的用户名和密码【英文标题】:passport match username and password in a sub document if the "parent" document doesn't have any matching username and passwords 【发布时间】:2016-05-09 09:25:04 【问题描述】:我正在考虑设置如下。将有一个管理员可以访问和工作人员可以访问的登录页面。管理员可以使工作人员可以看到某些数据(管理员可以创建工作人员)。现在的主要问题是将其与护照挂钩。我认为用户文档看起来像这样
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)
........................
我想知道如何才能访问工人级别,因为我认为上面的护照代码将查看顶部的用户名字段。
我想我想做这样的事情:如果在登录尝试时如果用户名密码不在顶层,则转到工人数组并测试用户名和密码是否匹配
也许如果User.findOne
没有找到用户做User.worker.findOne()
我该怎么做?
【问题讨论】:
【参考方案1】:如果您正在寻找任何与您匹配的组合,您基本上需要一个$or
查询条件,并使用$elemMatch
从特定的workers
条目中获取username
和password
组合:
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
用于确保“用户名”和“密码”都需要在数组上匹配元素,如果主“用户名”和“密码”在数组之外不匹配。
所以它的“非此即彼”,对数组的检查发生在查询方法的“内部”,而不是作为模型对象直接关闭的属性。
这里还要注意,由于“用户名”和“密码”可能“也”在一个数组对象中,那么其他内置的验证方法需要被这里的查询逻辑覆盖。所以“查询”需要验证匹配,当返回一个对象时,即返回一个“有效”结果。
这就是定制的成本。否则,只需拥有单独的用户帐户,所有帐户都具有您要应用的相同角色。
【讨论】:
以上是关于如果“父”文档没有任何匹配的用户名和密码,则护照匹配子文档中的用户名和密码的主要内容,如果未能解决你的问题,请参考以下文章