Как можно отключить создание новой учетной записи с помощью django-allauth, но при этом разрешить вход существующим пользователям?

У нас уже давно работает сайт, который использует django-allauth для аутентификации с использованием любого из:

  • Традиционная регистрация по электронной почте
  • Логин через гугл
  • Вход в Твиттер
  • Логин в фейсбук

... но теперь мы хотим, чтобы кто-либо не создавал новую учетную запись, но при этом позволял людям, которые ранее создали учетную запись, используя любой из этих методов, иметь возможность войти в систему. Есть ли настройка, которая позволит нам это сделать? Мне не ясно, позволит ли нам какой-либо из этих задокументированных настроек настроить это.

Текущие настройки, относящиеся к django-allauth:

INSTALLED_APPS = (
    'django.contrib.auth',
    ...
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'allauth.socialaccount.providers.google',
    'allauth.socialaccount.providers.facebook',
    'allauth.socialaccount.providers.twitter',
    ...
)

AUTHENTICATION_BACKENDS = (
    # Needed to login by username in Django admin, regardless of `allauth`
    "django.contrib.auth.backends.ModelBackend",
    # `allauth` specific authentication methods, such as login by e-mail
    "allauth.account.auth_backends.AuthenticationBackend",
)

SOCIALACCOUNT_PROVIDERS = {
    'google': {'SCOPE': ['https://www.googleapis.com/auth/userinfo.profile'],
               'AUTH_PARAMS': {'access_type': 'online'}},
    'facebook': {'SCOPE': ['email',]},
}

LOGIN_REDIRECT_URL = '/'

ACCOUNT_EMAIL_VERIFICATION = "mandatory"
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = True
SOCIALACCOUNT_AUTO_SIGNUP = True

person Mark Longair    schedule 22.04.2015    source источник


Ответы (1)


вопрос, связанный с rnevius, исправил это для меня. Чтобы добавить немного больше деталей, я создал файл mysite/account_adapter.py, содержащий:

from allauth.account.adapter import DefaultAccountAdapter

class NoNewUsersAccountAdapter(DefaultAccountAdapter):

    def is_open_for_signup(self, request):
        """
        Checks whether or not the site is open for signups.

        Next to simply returning True/False you can also intervene the
        regular flow by raising an ImmediateHttpResponse

        (Comment reproduced from the overridden method.)
        """
        return False

А затем добавил это к mysite/settings.py:

ACCOUNT_ADAPTER = 'mysite.account_adapter.NoNewUsersAccountAdapter'
person Mark Longair    schedule 22.04.2015
comment
В случае, если это поможет другим. Я следовал приведенным выше инструкциям, но назвал свой собственный файл адаптера account_adapter.py, который, кажется, зарезервирован, поэтому он давал ModuleNotFoundError. Мне пришлось переименовать его во что-то другое, например my_account_adapter.py, и тогда это сработало. - person curtisp; 02.11.2019
comment
@curtisp Вы пытались поместить это в папку своего приложения, например mysite/? - person Flimm; 13.11.2019
comment
Хорошо, спасибо, не прочитал ответ полностью. У меня он был в той же папке, что и settings.py, но я просто попытался переместить его в папку app с views.py и т. д., и он работает с именем account_adapter.py. - person curtisp; 13.11.2019