【问题标题】:How to use MongoDB built-in access control in Flask?如何在 Flask 中使用 MongoDB 内置的访问控制?
【发布时间】:2019-05-15 15:40:17
【问题描述】:

我有一个使用 pymongo 访问 mongo 数据库并满足用户请求的 Flask 应用程序。 我在 Mongo 中启用了访问控制,现在有几个用户与不同的角色相关联。更具体地说,每个用户仅对数据库中特定集合的子集具有读写权限。

我想让用户登录到应用程序并且只能访问他们特定的集合子集。这意味着需要从 db 获取一些数据的每个用户请求都绑定到(特定的)db-authenticated 连接。

flask 的主要扩展如 flask-login 和 flask-security 似乎没有使用 MongoDB 自己的认证机制。

一直在寻找一段时间,但我无法解决这个问题。

【问题讨论】:

    标签: python-3.x mongodb flask


    【解决方案1】:

    根据 MongoDB documentation 制作连接字符串。

    mongodb://[username:password@]host1[:port1][,...hostN[:portN]]][/[database][?options]]
    

    mongodb://myDBReader:D1fficultP%40ssw0rd@mongodb0.example.com:27017/admin
    

    您可以使用PyMongo 库连接到 MongoDB。

    from pymongo import MongoClient
    from flask import Flask, request
    
    app = Flask(__name__)
    
    @app.route('/login')
    def login():
        data = request.get_json()
        username = data['username']
        password = data['password']
        database = data['database']
        uri = 'mongodb://'+username+':'+password+'@localhost:27017/'+database
        print(uri) 
        app.config['uri'] = uri
    
    
    @app.route('/some_endpoint')
    def do_some_work():
        uri = app.config['uri']
        client = MongoClient(uri)
        # now use this as per your requirement.       
    
        client.close() 
    
    if __name__ == '__main__':
        app.run()
    

    这只是一个例子。您可以将其存储在 app.config 中并根据需要使用它。

    您可能想看到的另一个reference

    【讨论】:

    • 这种方法是否处理多个请求(Flask 以线程模式运行)? app.config['uri'] 不是每次都覆盖吗?
    • 如果我在用户 ID 和到数据库的(经过身份验证的)连接之间保留一个映射怎么办?这样,每个必须从数据库获取数据的用户请求都通过正确的连接来完成。这是个坏主意吗?
    • 是的,我认为应该可以。只需将连接字符串存储在地图中并使用该字符串进行连接。
    • 如果它对您有用,您可以接受答案,这样它可以帮助其他来访问您的问题的人。
    【解决方案2】:

    您可能需要重新考虑这种方法,因为与登录到您应用的每个用户打开一个新的数据库连接可能无法很好地扩展,因为 Mongo 会为每个新连接创建一个新线程。

    见:mongodb-max-connections

    我会考虑为烧瓶使用一些 RBAC,例如 flask-security

    【讨论】:

    • 感谢您的评论。我同意你的观点,该解决方案不能很好地扩展。我也明白,通常你只创建一个 MongoClient 并在整个应用程序中使用它。我担心的是我看不到这些设计原则如何与 MongoDB 自己的 RBAC 共存。
    猜你喜欢
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    相关资源
    最近更新 更多