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个解决方案,只是抛出一个名字。
您正在寻找的是 abac 又名基于属性的访问控制。它是 RBAC 作为访问控制模型的演变。在 RBAC 中,您根据角色、组和潜在权限定义访问控制。然后,您必须在应用程序中编写代码来理解角色和组。这称为 以身份为中心的访问控制。
在 ABAC 中,有 2 个新元素:
- 属性是组和角色的概括。属性是可以描述任何人和任何事物的键值对。例如,
department
、member
、action
都是属性。
- 策略将属性联系在一起,以确定是应该授予还是拒绝访问权限。策略是一种表达授权的人性化方式。您无需在应用程序中编写自定义代码,而是编写可以在应用程序、数据库和 API 之间集中管理和重用的策略。
有几种 ABAC 语言,例如 xacml and alfa。使用 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
我正在用 django 开发一个巨大的应用程序,我需要一个权限系统,我认为 django 中的原生 user/group 权限是不够的。这是我的需求:
该应用程序将通过多个部门提供。每个部门都会有几乎相同的操作。但是也许用户将被允许在部门 A 中添加新的团队成员,而在部门 B 中他只能查看团队列表,而在其他部门中他根本没有访问权限。 我虽然使用 RBAC 系统是最合适的。角色还必须是可继承的,存储在模型中并可通过界面进行管理。有什么好的想法或建议吗?问候
这个问题有两个组成部分:
首先,角色管理。可以通过组成员身份实现角色,即 departmentA_addMember & departmentB_listMembers。这些组将具有相应的权限,例如"Member | Add" 和 "Member | View"。此上下文中的部门可能包含更多资源,这些资源需要单独的权限。 Django 允许使用自定义 Permissions.
扩展对象第二,继承。我是否了解您想让各个组成为其他组的成员?那么这就是 Django 要求你自己实现的东西。
但是,如果您正在寻找一个真正更复杂的身份验证解决方案,那么与第三方服务集成可能是值得的,例如django-allauth。确实有more/other个解决方案,只是抛出一个名字。
您正在寻找的是 abac 又名基于属性的访问控制。它是 RBAC 作为访问控制模型的演变。在 RBAC 中,您根据角色、组和潜在权限定义访问控制。然后,您必须在应用程序中编写代码来理解角色和组。这称为 以身份为中心的访问控制。
在 ABAC 中,有 2 个新元素:
- 属性是组和角色的概括。属性是可以描述任何人和任何事物的键值对。例如,
department
、member
、action
都是属性。 - 策略将属性联系在一起,以确定是应该授予还是拒绝访问权限。策略是一种表达授权的人性化方式。您无需在应用程序中编写自定义代码,而是编写可以在应用程序、数据库和 API 之间集中管理和重用的策略。
有几种 ABAC 语言,例如 xacml and alfa。使用 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