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

问题描述 投票:0回答:1

假设你在 Django 中有这样一个具有一对多关系的实体结构:

- Company
  - Division
    - Department
      - Unit

每个用户都是

Unit
的一部分,因此我通过为具有 DepartmentDivision
Company
权限的用户分配
groups
来管理在
Django Admin
中创建、编辑和删除实体的权限。例如。 “DepartmentAdmin”、“DivisionAdmin”等。为了确定正确的权限,我只是沿着链上的
Unit
进行操作。够简单的。

现在我必须重构:用户现在可以成为多个

Unit
的成员(也许保留他们的“主要”
Unit
)。他们可以拥有任意权利来管理任何其他
Department
Division
等..

我该如何最好地建模?

我尝试过使用一个新实体

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 的现有的管理员权限管理功能?你会怎么做?

谢谢!

python django django-models data-structures django-admin
1个回答
0
投票

要对用户可以是多个单位的成员并具有管理不同部门、部门和公司的任意权限的场景进行建模,您可以使用多对多关系以及附加的权限和角色中间模型。这是一种解决方法:

  • 保留标准的 Django 用户模型用于用户身份验证。
  • 按照最初的方式定义单位模型。
  • 创建一个模型来表示用户在不同单位中的成员身份以及他们在这些单位中的角色/权限。该模型将具有用于存储有关用户角色、部门、部门和公司信息的字段。
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. 将用户与多个单位关联,每个单位都有其特定的角色和权限。 在权限模型中定义不同的权限/角色(例如 DepartmentAdmin、DivisionAdmin 等)。
  2. 通过在 MembershipRole 模型中创建记录将用户与这些权限相关联。
  3. 根据用户的成员资格和单位角色检查用户的权限。

在您的视图或控制器中,您可以通过查询用户的成员身份和角色来确定用户的权限。您还可以将 Django 的内置权限系统与此模型结合使用,以进一步控制对特定操作和视图的访问。

这种方法应该为您提供灵活性,以处理作为多个单元成员的用户并在每个单元内拥有任意权限,同时还可以更轻松地管理和查询用户权限。

© www.soinside.com 2019 - 2024. All rights reserved.