护照在子文件中匹配用户名和密码,如果"父母"文档没有任何匹配的用户名和密码

时间:2016-02-01 01:44:44

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

我正在考虑设置如下所示。将有一个管理员可以访问并且工作人员可以访问的登录页面。管理员可以使其成为工人可以看到某些数据(管理员可以创建工作人员)。现在的主要问题是用护照挂钩。我认为用户文档看起来像这样

{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(),我该怎么办呢?

1 个答案:

答案 0 :(得分:0)

如果您正在寻找与之匹配的任何组合,那么您基本上需要$or查询条件,并使用$elemMatch来获取usernamepassword组合特定的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;密码"可能"也"在数组对象中,其他内置验证方法需要在此处由查询逻辑覆盖。所以"查询"需要验证匹配,并在返回一个对象时返回一个"有效的"结果

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