同时使用组权限和个人权限

3
在Django中,我创建了一个包含各种用户组的系统。使用django.auth,我还创建了权限组,并将适当的应用程序权限与每个组关联起来。
这对于基于角色的访问非常有效,但现在我有一个要求,即我还需要能够从组中的特定用户中删除单个权限。这意味着我需要组权限,但同时这些组权限可以取消分配给单个用户。
使用Django组似乎无法直接实现此目标,因为权限是抽象的而不是针对单个用户的。 如何实现这一点? 我正在将所有内容更改为单个用户权限,但这对客户来说似乎有点繁琐,因为他们必须为每个新用户手动设置权限,希望有人知道更好的方法。

是的,您可以分配单个权限,但似乎您正在寻找负面权限,我不认为这是受支持的。您可以编写一个应用程序来实现该功能,或者重新定义权限的分配方式。毕竟,组权限旨在成为“此组所有成员都可以执行的操作”。 - Greg Schmit
1个回答

1

解决方案只需要在我的User模型中添加一个ManyToMany字段来保存已撤销的权限和自定义后端身份验证。

User模型:

revoked_permissions = models.ManyToManyField(Permission, blank=True)

身份验证后端:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import Permission


class UsersAuthenticationBackend(ModelBackend):
    def _get_revoked_perms(self, user_obj):
        if user_obj.is_superuser or user_obj.is_admin:
            revoked_perms = Permission.objects.none()
        elif hasattr(user_obj, 'revoked_permissions'):
            revoked_perms = getattr(user_obj, 'revoked_permissions').values_list('content_type__app_label', 'codename')
        else:
            revoked_perms = Permission.objects.none()

        revoked_perms = ["{}.{}".format(perm[0], perm[1]) for perm in revoked_perms]
        return revoked_perms

    def has_perm(self, user_obj, perm, obj=None):
        if not user_obj.is_active:
            return False

        revoked_perms = self._get_revoked_perms(user_obj)
        all_perms = self.get_all_permissions(user_obj)
        allowed_perms = [p for p in all_perms if not p in revoked_perms]

        return perm in allowed_perms

    def has_module_perms(self, user_obj, app_label):
        if not user_obj.is_active:
            return False

        revoked_perms = self._get_revoked_perms(user_obj)
        all_perms = self.get_all_permissions(user_obj)
        allowed_perms = [p for p in all_perms if not p in revoked_perms]

        for perm in allowed_perms:
            if perm[:perm.index('.')] == app_label:
                return True
        return False

Settings.py:

AUTHENTICATION_BACKENDS = [
    "apps.users.backends.UsersAuthenticationBackend"
]

使用这个功能,我现在可以设定整体的用户组权限,也可以为特定用户单独撤销权限。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接