【问题标题】: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() 我该怎么做?

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query passport.js


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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      • 2014-05-20
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多