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

时间:2017-12-01 11:09:48

标签: 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 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的

1 个答案:

答案 0 :(得分:1)

您可以使用flask guser_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']}