我是使用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
我需要替换
行lookup["_id"] = {'$in': ['5a19808f65a98412dba4b683', '5a1b06d365a98412a4445fa0'] }
使用数组的内容" canAccess"存在于经过身份验证的用户配置文件中(收集人员中的文档) - 类似于(伪代码) 选择数组canAccess的内容,其中lastname = authenticated_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的
答案 0 :(得分:1)
您可以使用flask g
将user_id
存储在每个请求的应用程序上下文中,以便您可以在钩子内检索它。
在check_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_auth
中的相同操作来检索帐户,从钩子内的数组中访问您的数据,大致如下:
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']}