Django функция has_perm не работает должным образом - PullRequest
0 голосов
/ 01 февраля 2020

У меня проблема с функцией django has_perm, как упомянуто выше. Он всегда возвращает True, даже если у пользователя нет разрешения Speci c.

Итак, мои настройки:

Индивидуальная модель пользователя

class MyAccountManager(BaseUserManager):
def create_user(self, email, username, password=None):
    if not email:
        raise ValueError("Users must have an email address")
    if not username:
        raise ValueError("Users must have an username")

    user = self.model(
            email=self.normalize_email(email),
            username=username,
         )
    user.set_password(password)
    user.save(using=self._db)
    return user

def create_superuser(self, email, username, password):
    user = self.create_user(
        email=self.normalize_email(email),
        password=password,
        username=username
    )
    user.is_admin = True
    user.is_staff = True
    user.is_superuser = True
    user.save(using=self._db)
    return user



class Accounts(AbstractBaseUser, PermissionsMixin):


email           = models.EmailField(verbose_name='email', max_length=60, unique=True)
is_admin        = models.BooleanField(default=False)
is_active       = models.BooleanField(default=True)
is_staff        = models.BooleanField(default=False)
is_superuser    = models.BooleanField(default=False)


objects = MyAccountManager()


USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []


def __str__(self):
    return self.email


def has_perm(self, perm, obj=None):
    return True

def has_module_perms(self, app_label):
    return True

два класса профиля пользователя с указанными c разрешениями

class Organizations(Accounts, PermissionsMixin):

name            =  models.CharField(max_length=30)
standort        = models.CharField(max_length=30)


def __str__(self):
    return self.name


class Meta:

    permissions = [("is_organization", "is organization")]

    verbose_name = 'Organization'
    verbose_name_plural = 'Organizations'



class Clients(Accounts, PermissionsMixin):

name            = models.CharField(max_length=30)
organization    = models.ForeignKey(Accounts, on_delete=models.CASCADE, null=True, blank= True, related_name='client')

def __str__(self):
    return self.name

class Meta:

    permissions = [("is_client", "is client")]


    verbose_name = 'Client'
    verbose_name_plural = 'Clients'

Пока что так хорошо. На данный момент я назначаю разрешения вручную или с помощью форм. Когда я проверяю разрешения с помощью

{{ perms.app_name }}

, я получаю список разрешений, и это работает, поэтому, например, я назначаю is_organization только для Organization, она возвращает список только этого разрешение.

Но когда я проверяю

{{ perms.app_name.is_organization }} и

{{ perms.app_name.is_client }}

, он возвращает true для обоих. Даже когда я проверяю что-то вроде

{{ perms.app_name.is_cl }}

, оно возвращает true. С другой стороны, если пользователь анонимный, он говорит False, и это работает.

Я думаю, что что-то забыл в функции has_perm, но я не знаю, что. Я очень благодарен за любую помощь здесь!

С наилучшими пожеланиями!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...