Пользовательский пользователь возвращает пустое get_all_permissions()
Я просто пытаюсь начать работать с Permissions
, чтобы узнать, как это работает.
В shell у меня пустой результат set()
. Я вижу этот вопрос, это то же самое, но я не могу найти, чего не хватает в моем коде:
Я создал Custom User
из AbstractBaseUser
, поэтому моя модель выглядит следующим образом:
settings.py
...
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'users',
]
AUTH_USER_MODEL = 'users.User'
AUTHENTICATION_BACKENDS = [
'users.backends.CustomModelBackend',
]
models.py
class UserManager(BaseUserManager):
def create_user(self, email, username, phone, password = None):
...
def create_superuser(self, email, username, phone, password = None):
...
class User(AbstractBaseUser, PermissionsMixin):
...
objects = UserManager()
...
def __str__(self):
return self.email
def has_perm(self, perm, obj=None):
return True
def has_module_perms(self, app_label):
return True
backends.py
class CustomModelBackend(backends.ModelBackend):
def user_can_authenticate(self, user):
return True
В shell
я пытаюсь сделать что-то вроде:
>>> from users.models import User
>>> user_test = User.objects.get(email="user@example.com")
>>> user_test.get_all_permissions()
set()
Это user
является superuser
. И я тестирую его на обычном пользователе, чтобы
EDIT
Я понял, что мне, возможно, нужно реализовать это в бэкенде, я не знаю, правильный ли это путь, но сделав следующее изменение, я получаю следующую ошибку:
backends.py edit
from django.contrib.auth import backends
def _user_get_permissions(user, obj, from_name):
permissions = set()
name = 'get_%s_permissions' % from_name
for backend in backends.get_backends():
if hasattr(backend, name):
permissions.update(getattr(backend, name)(user, obj))
return permissions
class CustomModelBackend(backends.ModelBackend):
def user_can_authenticate(self, user):
return True
def _get_user_permissions(self, user_obj):
return user_obj.user_permissions.all()
def get_all_permissions(self, obj=None):
return _user_get_permissions(self, obj, 'all')
Ошибка:
...
line 198, in _user_get_permissions
permissions.update(getattr(backend, name)(user, obj))
TypeError: get_all_permissions() takes from 1 to 2 positional arguments but 3 were given
Что необходимо для проверки этих разрешений?
Для суперпользователя этот список будет пустым. В методе has_perm есть IF для суперпользователя, и он всегда возвращает True для суперпользователя
В моем случае у меня был пользовательский класс User, и я пытался использовать djago-jazzmin для панели администратора. Я получал ошибку, потому что у меня не было метода get_all_permissions
в моей пользовательской модели User. Реализация указанного ниже метода решила мою проблему, и я смог успешно загрузить админку jazzmin:
def get_all_permissions(user=None):
if user.is_superadmin:
return set()