在Flask中分配组权限

时间:2015-04-18 20:10:23

标签: flask sqlalchemy flask-login flask-security

我有一个使用Flask-Security和MySQL的Flask应用程序。不幸的是,Flask-Security不提供组/多租户管理(https://github.com/mattupstate/flask-security/issues/285)。

我想实现以下内容:

  1. 登录时,用户输入他/她的登录凭据。
  2. 询问用户数据库以查看用户所属的组(管理,会计,销售等)。
  3. 如果用户属于多个组,则会弹出一个弹出窗口,列出用户所属的组。
  4. 在选择组时,用户登录,并为用户的会话设置全局变量(tenant_id或group_id)。然后,可以使用此全局变量对用户的任何数据库搜索进行预过滤。
  5. 我不确定如何实施第2步和第4步。是否可以使用Flask g.object(http://flask.pocoo.org/docs/0.10/api/#flask.g)来实现类似的内容?

2 个答案:

答案 0 :(得分:0)

Flask是一个很棒的框架,有许多现成的扩展,但在定制解决方案方面往往需要一些肘部润滑脂。

由于这似乎是您使用的身份验证后端缺少的功能,因此您可以考虑以下事项:

  • 切换到包含群组管理的后端
  • 自己动手
  • 扩展当前的后端

后两种选择都是劳动密集型的。

完成组管理后,您确实可以使用flask g选项。它应该足以存储对用户对象的引用。任何查询和过滤都可以在后端完成。

一些有趣的读物:

Building your own simple permission system如果您决定自己动手,可能会让您开始。

Related question解决方案实现了Flask-Principal

答案 1 :(得分:0)

您最有可能重复使用Flask-Security的角色来进行用户分组,并使其与您的用例保持相关。

您可以根据用户拥有的角色以及他们在多个角色中执行特定操作,您可以将特定角色存储在会话变量中,以跟踪他们现在所处的角色并向他们展示特定于该角色(组)的功能。

if user_datastore.find_role("db_amin") in current_user.roles:
    ... db admin specific ...

您还可以使用装饰器执行角色特定路线:

@roles_accepted("db_admin", "db_backup")
@roles_required('db_admin')

文档位于https://pythonhosted.org/Flask-Security/api.html