我正在django中开发一个大型应用程序,我需要一个权限系统,并且我认为django中的本机用户/组权限还不够。这是我的需求:
该应用程序可以通过多个部门使用。在每个部门中,几乎都有相同的动作。但是也许允许用户在部门A中添加新的团队成员,而在部门B中仅允许他查看团队列表,而在其他部门中他根本没有访问权限。 尽管使用RBAC系统是最合适的。角色还必须是可继承的,并且可以通过接口管理在模型中。有什么好的想法或建议吗?问候
答案 0 :(得分:1)
这个问题有两个组成部分:
首先,角色管理。可以通过组成员身份(即departmentA_addMember和departmentB_listMembers)来实现角色。这些组将附有相应的权限,例如“成员|添加”和“成员|视图”。在这种情况下,部门可能包含更多资源,这些资源需要单独的权限。 Django允许使用自定义Permissions扩展对象。
第二,继承。我是否知道您想让单个组成为其他组的成员?这就是Django要求您实现的事情。
但是,如果您正在寻找一种更为复杂的身份验证解决方案,则可能值得通过以下方式与第三方服务集成: django-allauth。当然,还有更多/其他解决方案,只是一个名字而已。
答案 1 :(得分:1)
您正在寻找的东西称为abac,又名基于属性的访问控制。它是RBAC作为访问控制模型的演变。在RBAC中,您可以根据角色,组和潜在的权限来定义访问控制。然后,您必须在应用程序内编写代码以了解角色和组。这称为以身份为中心的访问控制。
ABAC中有两个新元素:
department
,member
和action
都是属性。有几种ABAC语言,例如xacml和alfa。使用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的引擎/项目,例如: