diff options
| author | Tobias Bengfort <tobias.bengfort@posteo.de> | 2019-03-24 00:40:44 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2019-06-05 13:56:37 +0200 |
| commit | 581a0f45453f178b8abc0d09bd16ce06309ed33a (patch) | |
| tree | b9ac48689168b46346dbb6aabe726f3285f67531 /django | |
| parent | 75337a60509fdfdd321a5caf8e30d57fff6b9518 (diff) | |
Refs #30226 -- Added User.get_user_permissions() method.
Added to mirror the existing User.get_group_permissions().
Diffstat (limited to 'django')
| -rw-r--r-- | django/contrib/auth/backends.py | 13 | ||||
| -rw-r--r-- | django/contrib/auth/models.py | 28 |
2 files changed, 26 insertions, 15 deletions
diff --git a/django/contrib/auth/backends.py b/django/contrib/auth/backends.py index d20987f8e1..f4b1722757 100644 --- a/django/contrib/auth/backends.py +++ b/django/contrib/auth/backends.py @@ -15,11 +15,17 @@ class BaseBackend: def get_user(self, user_id): return None + def get_user_permissions(self, user_obj, obj=None): + return set() + def get_group_permissions(self, user_obj, obj=None): return set() def get_all_permissions(self, user_obj, obj=None): - return self.get_group_permissions(user_obj, obj=obj) + return { + *self.get_user_permissions(user_obj, obj=obj), + *self.get_group_permissions(user_obj, obj=obj), + } def has_perm(self, user_obj, perm, obj=None): return perm in self.get_all_permissions(user_obj, obj=obj) @@ -96,10 +102,7 @@ class ModelBackend(BaseBackend): if not user_obj.is_active or user_obj.is_anonymous or obj is not None: return set() if not hasattr(user_obj, '_perm_cache'): - user_obj._perm_cache = { - *self.get_user_permissions(user_obj), - *self.get_group_permissions(user_obj), - } + user_obj._perm_cache = super().get_all_permissions(user_obj) return user_obj._perm_cache def has_perm(self, user_obj, perm, obj=None): diff --git a/django/contrib/auth/models.py b/django/contrib/auth/models.py index 324faa6f3e..78fd7fbb5c 100644 --- a/django/contrib/auth/models.py +++ b/django/contrib/auth/models.py @@ -159,11 +159,12 @@ class UserManager(BaseUserManager): # A few helper functions for common logic between User and AnonymousUser. -def _user_get_all_permissions(user, obj): +def _user_get_permissions(user, obj, from_name): permissions = set() + name = 'get_%s_permissions' % from_name for backend in auth.get_backends(): - if hasattr(backend, "get_all_permissions"): - permissions.update(backend.get_all_permissions(user, obj)) + if hasattr(backend, name): + permissions.update(getattr(backend, name)(user, obj)) return permissions @@ -233,20 +234,24 @@ class PermissionsMixin(models.Model): class Meta: abstract = True + def get_user_permissions(self, obj=None): + """ + Return a list of permission strings that this user has directly. + Query all available auth backends. If an object is passed in, + return only permissions matching this object. + """ + return _user_get_permissions(self, obj, 'user') + def get_group_permissions(self, obj=None): """ Return a list of permission strings that this user has through their groups. Query all available auth backends. If an object is passed in, return only permissions matching this object. """ - permissions = set() - for backend in auth.get_backends(): - if hasattr(backend, "get_group_permissions"): - permissions.update(backend.get_group_permissions(self, obj)) - return permissions + return _user_get_permissions(self, obj, 'group') def get_all_permissions(self, obj=None): - return _user_get_all_permissions(self, obj) + return _user_get_permissions(self, obj, 'all') def has_perm(self, perm, obj=None): """ @@ -403,11 +408,14 @@ class AnonymousUser: def user_permissions(self): return self._user_permissions + def get_user_permissions(self, obj=None): + return _user_get_permissions(self, obj, 'user') + def get_group_permissions(self, obj=None): return set() def get_all_permissions(self, obj=None): - return _user_get_all_permissions(self, obj=obj) + return _user_get_permissions(self, obj, 'all') def has_perm(self, perm, obj=None): return _user_has_perm(self, perm, obj=obj) |
