Python Eve - 使用经过身份验证的用户信息的动态查找过滤器
Python Eve - Dynamic Lookup Filters using authenticated user informations
我是使用 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" 的内容出现在经过身份验证的用户配置文件(集合 people 中的文档)中 - 类似于(伪代码)
SELECT 数组 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"
}
如有任何帮助,我们将不胜感激。
谢谢
朱利奥
您可以使用 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']}
我是使用 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" 的内容出现在经过身份验证的用户配置文件(集合 people 中的文档)中 - 类似于(伪代码) SELECT 数组 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"
}
如有任何帮助,我们将不胜感激。 谢谢 朱利奥
您可以使用 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']}