Джанго Аллах с электронной почтой в качестве имени пользователя и несколькими сайтами

Можно ли использовать Django allauth с методом аутентификации, установленным на "email", при использовании его на нескольких сайтах?

Я хочу, чтобы пользователь с адресом электронной почты bob@example.com создал учетную запись на site1.com и отдельную учетную запись на site2.com.

Чтобы использовать аутентификацию по электронной почте, мне нужно оставить в настройках UNIQUE_EMAIL значение True, но это не позволяет пользователям, которые уже имеют учетные записи на одном сайте, создавать учетные записи на другом сайте.

1 ответ

Я предполагаю, что вы хотите, чтобы один и тот же адрес электронной почты регистрировался отдельно для каждого из сайтов в вашей настройке Django.

Глядя на код Аллаута; кажется, что в настоящее время это невозможно сделать, вероятно, потому что Аллах не учитывает идентификатор сайта как часть процесса регистрации пользователя.

class AppSettings(object):

    class AuthenticationMethod:
        USERNAME = 'username'
        EMAIL = 'email'
        USERNAME_EMAIL = 'username_email'

    class EmailVerificationMethod:
        # After signing up, keep the user account inactive until the email
        # address is verified
        MANDATORY = 'mandatory'
        # Allow login with unverified e-mail (e-mail verification is
        # still sent)
        OPTIONAL = 'optional'
        # Don't send e-mail verification mails during signup
        NONE = 'none'

    def __init__(self, prefix):
        self.prefix = prefix
        # If login is by email, email must be required
        assert (not self.AUTHENTICATION_METHOD ==
                self.AuthenticationMethod.EMAIL) or self.EMAIL_REQUIRED
        # If login includes email, login must be unique
        assert (self.AUTHENTICATION_METHOD ==
                self.AuthenticationMethod.USERNAME) or self.UNIQUE_EMAIL

Один из способов сделать это будет следующим: - Держи Аллаута AUTHENTICATION_METHOD как Имя пользователя - Храните сайт вместе с информацией о Пользователе, возможно, в UserProfile или путем переопределения Модели пользователя. - сделать комбинацию Email а также Site уникальный. - переопределить LoginView такой, что пользователь вводит электронную почту; Вы можете перевести комбинацию Email, Site на уникальную учетную запись пользователя и имя пользователя; которую вы можете передать Аллаху для входа в систему.

Предполагая, что вы используете платформу Sites; ваш код будет выглядеть примерно так:

from allauth.account.views import LoginView
from django.core.exceptions import ObjectDoesNotExist


class CustomLoginView(LoginView):

    def get_user():
        email = request.POST.get('email')
        current_site = Site.objects.get_current()
        try:
            user = User.objects.get(email=email, site=current_site)
        except ObjectDoesNotExist:
            pass  # Handle Error: Perhaps redirect to signup 
        return user


    def dispatch(self, request, *args, **kwargs):
        user = self.get_user()
        request.POST = request.POST.copy()
        request.POST['username'] = user.username
        return super(CustomLoginView, self).dispatch(request, *args, **kwargs)

Затем обезьяна-патч LoginView с пользовательским видом входа в систему:

allauth.account.views.LoginView = CustomLoginView

Связанные материалы по настройке Site FK и пользовательских аутентификационных бэкэндов:

Другие вопросы по тегам