Django 基于角色的权限

Django role based permissions

我正在用 django 开发一个巨大的应用程序,我需要一个权限系统,我认为 django 中的原生 user/group 权限是不够的。这是我的需求:

该应用程序将通过多个部门提供。每个部门都会有几乎相同的操作。但是也许用户将被允许在部门 A 中添加新的团队成员,而在部门 B 中他只能查看团队列表,而在其他部门中他根本没有访问权限。 我虽然使用 RBAC 系统是最合适的。角色还必须是可继承的,存储在模型中并可通过界面进行管理。有什么好的想法或建议吗?问候

这个问题有两个组成部分:

首先,角色管理。可以通过组成员身份实现角色,即 departmentA_addMember & departmentB_listMembers。这些组将具有相应的权限,例如"Member | Add" 和 "Member | View"。此上下文中的部门可能包含更多资源,这些资源需要单独的权限。 Django 允许使用自定义 Permissions.

扩展对象

第二,继承。我是否了解您想让各个组成为其他组的成员?那么这就是 Django 要求你自己实现的东西。

但是,如果您正在寻找一个真正更复杂的身份验证解决方案,那么与第三方服务集成可能是值得的,例如django-allauth。确实有more/other个解决方案,只是抛出一个名字。

您正在寻找的是 又名基于属性的访问控制。它是 RBAC 作为访问控制模型的演变。在 RBAC 中,您根据角色、组和潜在权限定义访问控制。然后,您必须在应用程序中编写代码来理解角色和组。这称为 以身份为中心的访问控制

在 ABAC 中,有 2 个新元素:

  • 属性是组和角色的概括。属性是可以描述任何人和任何事物的键值对。例如,departmentmemberaction都是属性。
  • 策略将属性联系在一起,以确定是应该授予还是拒绝访问权限。策略是一种表达授权的人性化方式。您无需在应用程序中编写自定义代码,而是编写可以在应用程序、数据库和 API 之间集中管理和重用的策略。

有几种 ABAC 语言,例如 and 。使用 ALFA,我可以编写以下策略:

  • A user will be allowed to add a new team member in department A
  • In department B he is only allowed to view the team list
  • In the other departments he has no access at all.
  • Roles must also be inheritable, stored in a model an managable through an interface.
policyset appAccess{
    apply firstApplicable
    policy members{
        target clause object = "member"
        apply firstApplicable
        /**
         * A user can add a member to a department if they are a manager and if they are assigned to that department.
         */
        rule addMember{
            target clause role == "manager" and action == "add"
            permit
            condition user.department == target.department
        }
    }
}

ABAC 的一个主要好处是您可以根据需要制定任意数量的策略、审核它们、共享它们,并且完全不必触及您的应用程序代码,因为您最终会外部化授权。

有几个引擎/项目实现了 ABAC,例如:

  • AuthZForce(XACML 授权的 Java 库)
  • Axiomatics Policy Server(商业产品 - 免责声明:我在那里工作)
  • AT&T XACML