Переопределение аутентификации Django не работает

Я создал файл "authentication.py - на том же уровне, что и ... settings.py" файл в моем проекте django. Содержимое этого файла:

from django.contrib.auth.models import User

class SettingsBackend(object):

    def authenticate(self, request, username=None, password=None):
        user_name = 'user_name'
        user_password = 'user_pass'
        login_valid = (user_name == username)
        pwd_valid = (password == user_password)
        if login_valid and pwd_valid:
            try:
                user = User.objects.get(username=username)
            except User.DoesNotExist:
                user = User(username=username)
                user.is_staff = True
                user.is_superuser = True
                user.save()
            return user
        return None

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

затем я добавил следующую строку в "settings.py файл:

AUTHENTICATION_BACKENDS = ('myProject.authentication.SettingsBackend',)

однако, логин не работает. Он работал до этих 2 модификаций, когда учетные данные пользователя хранились в базе данных. Я не знаю, как это отладить. Есть идеи ?

вот некоторые части моих настроек файл:

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.humanize',
    'default',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ["templates/"],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}




# Password validation
# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

LOGIN_REDIRECT_URL = '/'
LOGIN_URL = '/login'
LOGOUT_URL = '/logout'
ADMIN_ENABLED = False

редактировать: я удалил " db.sqlite3 " файл в корне моей папки, затем запустил оболочку django и сделал:

from django.contrib.sessions.models import Session
Session.objects.all().delete()

тогда я получаю это:

from django.contrib.auth.models import User
user = User.objects.get(username='user_name')
>> DoesNotExist: User matching query does not exist. 

2 ответов


Я был удивлен, что код не работал и исследовал его.

обратите внимание, что существует разница между версиями django:

запрос param для пользовательского бэкэнда, похоже, добавлен в 1.11. Если вы используете версию

def authenticate(self, username=None, password=None):

Django 1.10 запись-аутентификация-бэкэнд

Django 1.11 запись-аутентификация-бэкэнд

Я отладил его исследуя деф аутентификации(...) в источнике django он проходит через все бэкэнды.


вы можете попробовать запустить:

Session.objects.all().delete().

перед тестированием нового бэкэнда auth. из документов Django:

после аутентификации пользователя Django хранит бэкэнд, который использовался для аутентификация пользователя в сеансе пользователя и повторное использование backend на время этого сеанса всякий раз, когда доступ к в настоящее время требуется аутентифицированный пользователь. Это фактически означает, что источники аутентификации кэшируются на основе каждого сеанса, поэтому если вы измените AUTHENTICATION_BACKENDS, вам нужно будет очистить данные сеанса если вам нужно заставить пользователей повторно аутентифицироваться с помощью разных методов. Простой способ сделать это-просто выполнить Сессия.объекты.все.)(исключать.)(