多密码DJANGO

问题描述

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

这是我在view.py

中所做的大致操作
        request.session['pass_kinit2030'] = password
        request.session['reg_pass'] = reg_pass
        request.session['oraclepass'] = oraclepass

解决方法

我可以看到几个选项:

  1. 如果三个密码都相等,那么我想您只是在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. 最后但并非最不重要的一点是,您可能不喜欢令牌的概念,或者可能没有在相关的两个应用程序中实现令牌。然后的问题是,如何访问这两个应用程序?它们是HTTP服务器吗?如果是,那么您已经准备就绪。浏览器应将登录会话分别保留到其他两个应用程序。而且,如果我们谈论某种类型的API,您仍然可以重定向到这些应用/对它们进行iframe或执行JavaScript GET或POST-是的,JS请求将使用登录会话。
,

我最终使用了多种try / except方法来测试其他服务的登录。 尝试:

import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      home: Row(
        children: <Widget>[
          Container(
            color: Colors.red,width: 100,height: 100,),Dismissible(
            key: UniqueKey(),child: Container(
              color: Colors.blue,width: 70,height: 70,Container(
            color: Colors.red,],);
}