如果“父”文档没有任何匹配的用户名和密码,则护照匹配子文档中的用户名和密码

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 条目中获取usernamepassword 组合:

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 用于确保“用户名”和“密码”都需要在数组上匹配元素,如果主“用户名”和“密码”在数组之外不匹配。

所以它的“非此即彼”,对数组的检查发生在查询方法的“内部”,而不是作为模型对象直接关闭的属性。

这里还要注意,由于“用户名”和“密码”可能“也”在一个数组对象中,那么其他内置的验证方法需要被这里的查询逻辑覆盖。所以“查询”需要验证匹配,当返回一个对象时,即返回一个“有效”结果。

这就是定制的成本。否则,只需拥有单独的用户帐户,所有帐户都具有您要应用的相同角色。

【讨论】:

以上是关于如果“父”文档没有任何匹配的用户名和密码,则护照匹配子文档中的用户名和密码的主要内容,如果未能解决你的问题,请参考以下文章

如何在更换新护照之前检查密码是不是匹配

如何修复阻止注册用户登录的护照本地身份验证错误

mongodb - 如果数组中的某个元素与查询匹配,则忽略文档

Django 表单:无法显示验证错误

NodeJs :- 使用本地护照时出现“缺少凭据”错误

如何解决护照认证产生的错误