Mongodb Python Eve-使用经过身份验证的用户信息的动态查找过滤器
我是使用MongoDB和Eve的新手;我在设置动态查找筛选器时遇到问题。 我的用例是在pre_GET中只包含其_id包含在(已验证的)用户配置文件中的列表(数组)中的文档。 现在,当这个列表是静态的时,它可以像这样正常工作: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
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,我没有在这样的环境中使用过。