在Django admin中,如何管理复杂的用户权限?

20jt8wwn  于 2023-11-20  发布在  Go
关注(0)|答案(1)|浏览(112)

假设你在Django中有这样一个实体结构,它具有to-many关系:

- Company
  - Division
    - Department
      - Unit

字符串
每个用户都是Unit的一部分,所以我通过为具有DepartmentDivisionCompany权限的用户分配 * 组 * 来管理在 Django Admin 中创建,编辑和删除实体的权限。例如“DepartmentAdmin”,“DivisionAdmin”等。为了确定正确的权限,我只是沿着Unit向上走。很简单。
现在我必须重构:用户现在可以成为多个Unit的成员(可能保留其“主”Unit)。他们可以拥有任意权限来管理任何其他DepartmentDivision等。
我该如何最好地模仿它?
我尝试了一个新的实体Membership,一种带有角色/权限附加信息的连接表。这是一个好主意吗?我发现这在其他地方创建了很多依赖关系,并且确定权限非常复杂。
例如

class Membership(models.Model):
    user = models.ForeignKey(User,
       on_delete=models.CASCADE, related_name="other_departments")
    department = models.ForeignKey(Department, 
       on_delete=models.CASCADE, related_name="other_members")
    position = models.CharField(_("Position"), max_length=32, null=True, blank=True)


或者有没有更好的方法来利用Django现有的管理员权限管理功能?你会怎么做?
谢谢你,谢谢

91zkwejq

91zkwejq1#

要对用户可以是多个Unit的成员并具有管理不同Departments、Division和Companies的任意权限的场景建模,您可以使用多对多关系,并为权限和角色提供额外的中间模型。

  • 保留标准的Django User模型进行用户身份验证。
  • 按照最初的方式定义Unit模型。
  • 创建一个模型,表示用户在不同单位中的成员身份及其在这些单位中的角色/权限。此模型将包含用于存储有关用户角色、部门、分部和公司的信息的字段。
from django.db import models

class Membership(models.Model):
     user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="memberships")
     unit = models.ForeignKey(Unit, on_delete=models.CASCADE, related_name="memberships")
     position = models.CharField(_("Position"), max_length=32, null=True, blank=True)

字符串

产品型号:您可以创建一个模型来定义用户在单位内可以拥有的不同权限和角色(例如,管理员、经理等)。此模型可用于授予和管理特定权限。

class Permission(models.Model):
    name = models.CharField(max_length=50)
    description = models.TextField()

class MembershipRole(models.Model):
    membership = models.ForeignKey(Membership, on_delete=models.CASCADE)
    permission = models.ForeignKey(Permission, on_delete=models.CASCADE)


使用此结构,您可以:
1.将用户与多个单位相关联,每个单位都有其特定的角色和权限。在Permission模型中定义不同的权限/角色(例如,DepartmentAdmin、DivisionAdmin等)。
1.通过在用户角色模型中创建记录,将用户与这些权限相关联。
1.根据用户在单位中的成员身份和角色检查用户的权限。
在视图或控制器中,您可以通过查询用户的成员身份和角色来确定用户的权限。您还可以使用Django内置的权限系统与此模型结合使用,以进一步控制对特定操作和视图的访问。
这种方法可以灵活地处理用户是多个单元的成员,并且在每个单元中具有任意权限,同时还可以更容易地管理和查询用户权限。

相关问题