#python #django #django-views #django-authentication
#python #django #django-просмотры #django-аутентификация
Вопрос:
Я создаю приложение, которое аутентифицируется у пользователей для AD, но затем ему также требуются отдельные пароли для аутентификации для двух других сервисов. Есть ли способ использовать 3 пароля для подтверждения входа в систему? Я могу настроить проверку входа в систему индивидуально для каждой службы, но мне было интересно, смогу ли я сохранить все три пароля в одном сеансе. Причина в том, что пользователям потребуется пройти аутентификацию в нескольких сервисах, чтобы использовать все функции этого приложения.
вот примерно то, что я делаю в своем view.py
request.session['pass_kinit2030'] = password
request.session['reg_pass'] = reg_pass
request.session['oraclepass'] = oraclepass
Комментарии:
1. Я не думаю, что хранение паролей в сеансе является хорошей идеей (особенно незашифрованных версий).
2. Я предполагаю, что связь с двумя другими службами будет осуществляться с использованием серверной части (Python), а не клиентской (JS), поэтому нет необходимости проходить аутентификацию с использованием нескольких паролей (просто аутентифицируйте пользователя, используя обычный логин Django, и используйте другие пароли от имени аутентифицированного пользователя).
Ответ №1:
Я вижу несколько вариантов:
- Если все ваши 3 пароля равны, я полагаю, вы просто определяете свой собственный
AUTHENTICATION_BACKEND
в Django. В таком бэкэнде вы бы просто взяли пароль и проверили, действителен ли он во всех трех сервисах.
В yourapp/auth.py
:
from django.contrib.auth.backends import BaseBackend
class MyAuthBackend(BaseBackend):
def authenticate(self, request, username=None, password=None):
# Check reg and oracle - if valid, return request.user, else return None
В settings.py
:
AUTHENTICATION_BACKENDS = ['yourapp.auth.MyAuthBackend']
Но поскольку вы сказали separate passwords
, я полагаю, что они не равны.
- В случае, если пароли не равны, сомнительно запрашивать 2 других пароля в этом одном приложении, в первую очередь. Вы не должны запрашивать у пользователя 2 других пароля в форме входа. Обычно вы должны аутентифицировать свои два других приложения, используя какой-либо токен. Затем вы подключаете свои приложения с помощью такого токена в режиме, отличном от режима входа. Имея такой токен, вы должны сохранить его значение в новой модели, которая имеет
OneToOneField
отношение к пользователю:
from django.conf import settings
from django.db import models
class UserTokens(models.Model):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
reg_token = forms.CharField(
null=True,
max_length=100)
oracle_token = models.CharField(
null=True,
max_length=100)
Вы также можете использовать пароль в качестве токена, при условии, что пароль генерируется аналогично токену (и не может быть изменен на значение, заданное пользователем — я знаю такие случаи).
- И последнее, но не менее важное: вам может не понравиться идея токенов или они могут не быть реализованы в связанных двух приложениях. Тогда возникает вопрос, как осуществляется доступ к этим двум приложениям? Являются ли они HTTP-серверами? Если да, то у вас все готово. Браузер должен сохранять сеанс входа в два других приложения отдельно. И, тем не менее, вы можете перенаправлять на эти приложения / создавать их iframe или выполнять JavaScript GETs или POSTs, если мы говорим о каком-либо API — да, запросы JS будут использовать сеанс входа в систему.
Ответ №2:
В итоге я использовал несколько методов try / except для тестирования входа в систему в других службах. попробуйте:
try:
a = add_user().login(username=creds['user'], password=creds['banpass'])
add_user().logout(a)
except:
messages.error(request, 'Banner Password Is Incorrect')
return redirect('login')
if Usermanager(creds=creds).test_login():
pass
else:
messages.error(request, 'Wrong Regular Account Credentials')
return redirect('login')
if user is not None:
auth.login(request, user)
return redirect('userinfo')
else:
messages.error(request, 'Wrong AdminCredentials')
return redirect('login')