基于Django角色的权限

时间:2018-12-04 18:01:15

标签: django authorization access-control rbac abac

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

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

2 个答案:

答案 0 :(得分:1)

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

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

第二,继承。我是否知道您想让单个组成为其他组的成员?这就是Django要求您实现的事情。

但是,如果您正在寻找一种更为复杂的身份验证解决方案,则可能值得通过以下方式与第三方服务集成: django-allauth。当然,还有更多/其他解决方案,只是一个名字而已。

答案 1 :(得分:1)

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

ABAC中有两个新元素:

  • 属性是组和角色的概括。属性是可以描述任何人和任何事物的键/值对。例如,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