Mongodb Python Eve-使用经过身份验证的用户信息的动态查找过滤器

Mongodb Python Eve-使用经过身份验证的用户信息的动态查找过滤器,mongodb,eve,Mongodb,Eve,我是使用MongoDB和Eve的新手;我在设置动态查找筛选器时遇到问题。 我的用例是在pre_GET中只包含其_id包含在(已验证的)用户配置文件中的列表(数组)中的文档。 现在,当这个列表是静态的时,它可以像这样正常工作: class BCryptAuth(BasicAuth): def check_auth(self, username, password, allowed_roles, resource, method): # use Eve's own db driver; no

我是使用MongoDB和Eve的新手;我在设置动态查找筛选器时遇到问题。 我的用例是在pre_GET中只包含其_id包含在(已验证的)用户配置文件中的列表(数组)中的文档。 现在,当这个列表是静态的时,它可以像这样正常工作:

class BCryptAuth(BasicAuth):
def check_auth(self, username, password, allowed_roles, resource, method):
    # use Eve's own db driver; no additional connections/resources are used
    accounts = app.data.driver.db['people']
    account = accounts.find_one({'lastname': username})
    return account and \
    bcrypt.hashpw(password, account['password']) == account['password']

# Hook Test
def pre_GET(resource, request, lookup):
    lookup["_id"] = {'$in': ['5a19808f65a98412dba4b683', '5a1b06d365a98412a4445fa0'] }

    if __name__ == '__main__':
       app = Eve(auth=BCryptAuth)   
    # Hook Test
    app.on_pre_GET += pre_GET
    # End Hook Test
from flask import g

def pre_GET(resource, request, lookup):
    user_id = getattr(g, 'user_id', None)
    people = app.data.driver.db['people']
    user = accounts.find_one({'_id': user_id})
    lookup["_id"] = {'$in': user['canAcess']}
我需要的是替换这条线

lookup["_id"] = {'$in': ['5a19808f65a98412dba4b683', '5a1b06d365a98412a4445fa0'] }
数组“canAccess”的内容出现在经过身份验证的用户配置文件(人员集合中的文档)中,类似(伪代码) 选择数组canAccess的内容,其中lastname=authenticated\u user()。 这是代表用户的文档:

{
        "_updated": "Sat, 25 Nov 2017 14:39:11 GMT",
        "firstname": "barack",
        "lastname": "obama",
        "role": [
            "copy",
            "author"
        ],
        "canAccess": [
            "5a1b06d365a98412a4445fa0",
            "5a1c5c9265a984120caf7e0b"
        ],
        "_created": "Sat, 25 Nov 2017 14:39:11 GMT",
        "_id": "5a19808f65a98412dba4b683",
        "_etag": "758056ac49d156526858bd3a8b4922d65231942f"
    } 
任何帮助都将不胜感激。 谢谢
Giulio

您可以使用flask
g
在每个请求应用程序上下文中存储
用户id
,以便在钩子中检索它

中检查\u auth

from flask import g

def check_auth(self, username, password, allowed_roles, resource, method):
    people = app.data.driver.db['people']
    user = people.find_one({'lastname': username})
    g.user_id = user['_id']
    return account and \
    bcrypt.hashpw(password, account['password']) == account['password']
然后,您可以通过在
check\u auth
中执行相同的操作来检索帐户,从而从钩子中的数组访问数据,大致如下所示:

class BCryptAuth(BasicAuth):
def check_auth(self, username, password, allowed_roles, resource, method):
    # use Eve's own db driver; no additional connections/resources are used
    accounts = app.data.driver.db['people']
    account = accounts.find_one({'lastname': username})
    return account and \
    bcrypt.hashpw(password, account['password']) == account['password']

# Hook Test
def pre_GET(resource, request, lookup):
    lookup["_id"] = {'$in': ['5a19808f65a98412dba4b683', '5a1b06d365a98412a4445fa0'] }

    if __name__ == '__main__':
       app = Eve(auth=BCryptAuth)   
    # Hook Test
    app.on_pre_GET += pre_GET
    # End Hook Test
from flask import g

def pre_GET(resource, request, lookup):
    user_id = getattr(g, 'user_id', None)
    people = app.data.driver.db['people']
    user = accounts.find_one({'_id': user_id})
    lookup["_id"] = {'$in': user['canAcess']}

非常感谢gcw,它似乎工作得很好。顺便说一句,如果在一个巨大的环境(数百万个文档)中使用这个解决方案,你会发现一些性能问题吗?不确定@giulio_l,我没有在这样的环境中使用过。