Расширение модели пользователя django (AbstractEmailUser) - PullRequest
0 голосов
/ 04 июня 2018

У меня есть расширенная модель пользователя, как показано ниже.

class User(AbstractEmailUser):

    first_name = models.CharField(verbose_name=_('First name'),max_length=128)
    last_name = models.CharField(verbose_name=_('Last name'), max_length=128)
    avatar = StdImageField(upload_to='user_avatars/', null=True, blank=True, variations={
        'thumbnail': (settings.AVATAR_THUMBNAIL_WIDTH, settings.AVATAR_THUMBNAIL_HEIGHT, True)
    })
    user_name = models.CharField(null=True,blank=True,verbose_name=_('User id'), max_length=128)


    def get_short_name(self):
        return self.last_name

    def get_full_name(self):
        return "%s %s" % (self.first_name, self.last_name)

    def __unicode__(self):
        return self.email

    def get_thumbnail_url(self):
        return self.avatar.thumbnail.url if self.avatar else None

Я хочу аутентифицировать всех пользователей, кроме администратора, используя поле электронной почты и поле администратора по имени пользователя в расширенной модели пользователя ..... Iя использую django 1.9

Есть ли способ сделать это по умолчанию ...

1 Ответ

0 голосов
/ 04 июня 2018

Таким образом, вы должны создать пользовательский бэкэнд аутентификации.Пользователь до аутентификации является анонимным, поэтому мы не можем сказать, является ли он администратором или нет.Я думаю, что вы можете сделать это, чтобы аутентифицировать пользователей, используя либо имя пользователя, либо электронную почту, если они являются администратором, аутентифицируют их независимо от того, что они использовали (имя пользователя или адрес электронной почты), но обычные пользователи должны использовать электронную почту, если это не так, вернуть None.

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model
from django.core.validators import validate_email
from django.contrib.auth.hashers import check_password

class MyAuthenticationBackend(ModelBackend):
"""
Authenticate All users if Email is used but just the admin if username is used
"""
    def authenticate(self, request, username=None, password=None):

        try:
            validate_email(username)
            valid_email = True
            kwargs = {'email': username}
        except:
            valid_email = False
            kwargs = {'username': username}

        try:
            user = get_user_model().objects.get(**kwargs)
        except get_user_model().DoesNotExist:
            print("User model does not exist!")
            return None

        if valid_email and user.check_password(password):
            print("Email used. Authenticate all users")
            return user

        elif not valid_email and user.check_password(password) and user.is_admin:
            print("Username used. Authenticate admin users")
            return user
        else:
            print("something else return None")
            return None


    def get_user(self, user_id):
        try:
            return get_user_model().objects.get(pk=user_id)
        except get_user_model().DoesNotExist:
            return None

и в settings.py файле

AUTHENTICATION_BACKENDS = [
'app.admin.MyAuthenticationBackend',
]

Поля, которые вы используете для аутентификации, должны иметь уникальное значение True, а пробел и ноль должны быть False.

email = models.EmailField(
    null=True,
    blank=True,
    verbose_name='email address',
    max_length=255,
    unique=True,
)
username = models.CharField(
    null=True,
    blank=True,
    verbose_name=_('User id'), 
    max_length=128,
    unique=True,
)
...