Skip to main content
 首页 » 编程设计

python之Django:根据一对一字段限制用户 "can change/delete"权限

2024年08月20日31jiqing9006

所以我添加了一个一对一的字段来扩展Django auth用户模型:

class Employee(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    division = models.ForeignKey(Division, on_delete=models.CASCADE) 

我想实现的是每个Employee都有权限修改其他Employee对象,但仅限于同部门的。

我创建了一个“员工”权限组,具有添加/更改/删除用户和员工对象的权限。

现在每个员工对所有 员工和所有 用户对象都有“可以更改”权限。

我设法过滤了 OneToOneField 上的 django 管理更改列表,因此每个员工只能在更改列表中看到他们自己部门的员工。

问题是,如果他们手动输入用于更改另一个部门的用户的 URL,他们就能够更改/删除该用户。同样,他们甚至可以更改/删除 super 用户(用户 1)。导航到:

http://localhost:8000/admin/auth/user/1/change/ 

会成功的。

我想解决这个问题是覆盖 auth 用户更改方法,添加一个“部门或 super 用户”检查,但这看起来很老套。我更愿意根据划分来限制对更改 URL 的访问,但我还没有找到实现此目的的方法。

感谢您的任何建议!

请您参考如下方法:

您可以使用 UserPassesTestMixin在基于类的 View 中强制当前用户针对她/他试图更改的员工部门进行测试。

假设 change 方法是以下示例的 POST 方法:

from django.contrib.auth.mixins import UserPassesTestMixin 
 
class MyView(UserPassesTestMixin, View): 
 
    def test_func(self): 
        ch_user_division = Employee.objects.filter( 
            pk=self.request.POST.get('user_id') 
        ).values('division') 
        return self.request.user.division == ch_user_division 

现在基于类的 MyView 检查用户是否与要更改的用户在同一部门。

有关如何限制用户访问的更多信息:https://docs.djangoproject.com/en/1.11/topics/auth/default/#limiting-access-to-logged-in-users-that-pass-a-test


出于评论遗留原因留下以下内容:

您可以使用 ForeignKey.limit_choices_to关于模型定义的参数,其中:

Sets a limit to the available choices for this field when this field is rendered using a ModelForm or the admin.

尝试以下操作:

class Employee(models.Model): 
    user = models.OneToOneField( 
        User,  
        on_delete=models.CASCADE, 
        limit_choices_to={'division': division} 
    ) 
    division = models.ForeignKey(Division, on_delete=models.CASCADE)