Я пытаюсь настроить пользовательский бэкэнд, который запрашивает другую базу данных, для которой я создал модель в системе. Он использует свои собственные правила (электронная почта вместо имени пользователя и пароль с разными солями / хэшированными), поэтому я не могу использовать встроенную аутентификацию. Я настроил пользовательский сервер аутентификации следующим образом:
class BlahBlahBackend:
def check_password():
# check password code here
return true
def authenticate(self, email=None, password=None):
import myapp.models.loginmodel
try:
person = myapp.models.loginmodel.People.objects.get(email=email)
if check_password(password, person.password):
try:
user = User.objects.get(email=email)
except User.DoesNotExist:
username=person.first_name + person.last_name
name_count = User.objects.filter(username__startswith = username).count()
if name_count:
username = '%s%s'%(username, name_count + 1)
user = User.objects.create_user(username,email)
else:
user = User.objects.create_user(username,email)
except People.DoesNotExist:
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
Я добавил BlahBlahBackend в качестве бэкэнда аутентификации:
AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend',
'Socialauth.auth_backends.OpenIdBackend',
'Socialauth.auth_backends.TwitterBackend',
'Socialauth.auth_backends.FacebookBackend',
'Socialauth.auth_backends.BlahBlahBackend',
)
Как вы видите, я также использую некоторые уже существующие аутентификационные бэкэнды, которые также есть в socialauth.
У меня есть форма представления, которая указывает на следующее представление:
def blahblah_login_complete(request):
email = request.POST.get('email')
password = request.POST.get('password')
user = authenticate(email,password)
# if user is authenticated then login user
if user:
login(request, user)
else:
return HttpResponseRedirect(reverse('socialauth_login_page'))
Однако, когда я пытаюсь войти таким образом, кажется, что один или несколько других бэкэндов действуют так, как будто я пытаюсь войти, используя их метод.
Я читал, что бэкэнды кэшируются и поэтому запускаются
Session.objects.all().delete()
для очистки кэша бэкэндов.
Мои основные вопросы:
- Порядок, в котором элементы перечислены в AUTHENTICATION_BACKENDS
- Как система решает / знает, какой бэкэнд использовать? Это никогда не было ясно из документации, и я нахожу это немного запутанным.
- Есть ли способ принудительного использования определенной авторизации на основании запроса. Другими словами, если кто-то отправляет форму, есть ли способ заставить его использовать аутентификацию на основе входа в систему, в отличие от входа через openid или Twitter?
Обновление:
Это работает! Это очень круто, спасибо. Я думаю, просто казалось, что django doc говорил: «Больше ничего не нужно делать, это просто работает, как по волшебству», и оказывается, что это абсолютно так. Пока есть серверная часть и правильно установлены учетные данные, аутентификация будет работать. Как оказалось, настоящей проблемой была неверная конфигурация в файле urls.py, который не отправлял сообщение из формы входа в правильный обработчик, поэтому он продолжал пытаться использовать другой метод аутентификации.