Множественный пароль DJANGO

#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:

Я вижу несколько вариантов:

  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 , я полагаю, что они не равны.

  1. В случае, если пароли не равны, сомнительно запрашивать 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)
  

Вы также можете использовать пароль в качестве токена, при условии, что пароль генерируется аналогично токену (и не может быть изменен на значение, заданное пользователем — я знаю такие случаи).

  1. И последнее, но не менее важное: вам может не понравиться идея токенов или они могут не быть реализованы в связанных двух приложениях. Тогда возникает вопрос, как осуществляется доступ к этим двум приложениям? Являются ли они 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')