繁体   English   中英

Django基于角色的权限

[英]Django role based permissions

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

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

这个问题有两个部分:

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

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

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

您在寻找什么叫做 aka基于属性的访问控制。 它是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库)
  • 公理政策服务器 (商业产品-免责声明:我在那儿工作)
  • 美国电话电报公司XACML

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM