Смотря на уровень управления, который вы хотите иметь, вы захотите использовать функции authenticate
и, возможно, login
в django.contrib.auth
.Это основные функции для доступа к аутентификации.Я должен подчеркнуть, что вы действительно должны использовать их вместо того, чтобы находить пользователя и проверять хеш пароля вручную.Существует ряд причин, по которым:
- они будут использовать любой аутентификационный бэкэнд, который вы или кто-то другой в будущем установили
- ваша версия будет гораздо менее проверена, чем Django ис большей вероятностью откроет дыры в безопасности
- это быстрее, короче, более гибко и более читабельно
- Приложение аутентификации Django, вероятно, изменится в ближайшем будущем, придерживаясь
authenticate
, вы сможете перейти нановое приложение аутентификации, когда оно будет написано / зафиксировано / выпущено
Если вы хотите переписать способ обнаружения и аутентификации пользователя, напишите свой собственный Authenticate backend , который будетиспользоваться при вызове authentication
(даже в чужом приложении, например, в админке).Это единственное место, где вы должны переписать аутентификацию в Django.
Следующие примеры взяты из Django auth docs .
1.Проверка пароля пользователя:
from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
if user is not None:
if user.is_active:
print "You provided a correct username and password!"
else:
print "Your account has been disabled!"
else:
print "Your username and password were incorrect."
2.Пользовательский бэкэнд аутентификации:
Вот бэкэнд, который использует тот же метод аутентификации, что и Django, который вы можете найти по адресу django.contrib.auth.backends.ModelBackend
:
from django.contrib.auth.models import User
class MyBackend:
def authenticate(self, username=None, password=None):
try:
user = User.objects.get(username=username)
if user.check_password(password):
return user
except User.DoesNotExist:
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None