【问题标题】:Multiple Password DJANGO多密码DJANGO
【发布时间】:2020-12-29 10:00:15
【问题描述】:

我正在创建一个对 AD 用户进行身份验证的应用程序,但它还需要单独的密码来对其他两个服务进行身份验证。有没有办法使用 3 个密码来验证登录?我可以为每个服务单独设置登录验证,但我想知道是否可以将所有三个密码存储在同一个会话中。原因是用户需要通过多个服务进行身份验证才能使用此应用的所有功能。

这大概是我在 view.py 中所做的事情

        request.session['pass_kinit2030'] = password
        request.session['reg_pass'] = reg_pass
        request.session['oraclepass'] = oraclepass

【问题讨论】:

  • 我认为在会话中存储密码不是一个好主意(尤其是非加密版本)。
  • 我猜与其他两个服务的通信将使用服务器端(Python)而不是客户端(JS)完成,因此无需使用多个密码进行身份验证(只需验证用户使用常规 Django 登录并代表经过身份验证的用户使用其他密码)。

标签: python django django-views django-authentication


【解决方案1】:

我可以看到几个选项:

  1. 如果您的 3 个密码都相同,我想您只需在 Django 中定义自己的 AUTHENTICATION_BACKEND。在这样的后端,您只需输入密码并检查它是否在所有三个服务中都有效。

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. 最后但并非最不重要的一点是,您可能不喜欢令牌的想法,或者可能没有在相关的两个应用程序中实现它们。那么问题来了,这两个app是怎么访问的呢?它们是 HTTP 服务器吗?如果是,那么您已准备就绪。浏览器应分别保持与其他两个应用程序的登录会话。而且,如果我们谈论某种 API,您仍然可以重定向到这些应用程序/iframe 或执行 JavaScript GET 或 POST - 是的 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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 2011-04-01
      相关资源
      最近更新 更多