【问题标题】:Django role based permissionsDjango 基于角色的权限
【发布时间】:2023-03-15 03:47:01
【问题描述】:

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

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

【问题讨论】:

    标签: django authorization access-control rbac abac


    【解决方案1】:

    您要查找的内容称为 aka Attribute-Based Access Control。它是 RBAC 作为访问控制模型的演变。在 RBAC 中,您可以根据角色、组和潜在权限来定义访问控制。然后,您必须在应用程序中编写代码来理解角色和组。这称为以身份为中心的访问控制

    在 ABAC 中,有 2 个新元素:

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

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

    • 将允许用户在部门 A 中添加新的团队成员
    • 在 B 部门,他只能查看团队列表
    • 在其他部门,他根本无权访问。
    • 角色还必须是可继承的,存储在模型中并可以通过接口进行管理。
    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

    【讨论】:

    • 这正是我正在寻找的。我会研究这个,如果有问题,我会回复你。谢谢 ;)
    【解决方案2】:

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

    首先,角色管理。角色可以通过组成员身份来实现,即部门A_addMember 和部门B_listMembers。这些组将附加相应的权限,例如“会员|添加”和“会员|查看”。在这种情况下,一个部门可能包含更多资源,需要单独的权限。 Django 允许使用自定义Permissions 扩展对象。

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

    但是,如果您正在寻找更复杂的身份验证解决方案,则可能值得通过以下方式与 3rd 方服务集成,例如django-allauth。肯定有更多/其他解决方案,只需输入一个名称。

    【讨论】:

      猜你喜欢
      • 2018-05-29
      • 2021-09-16
      • 1970-01-01
      • 2019-12-08
      • 1970-01-01
      • 2020-03-05
      • 2020-12-18
      • 2020-12-17
      • 2015-11-20
      相关资源
      最近更新 更多