多密码 DJANGO
Multiple Password DJANGO
我正在创建一个针对 AD 向用户进行身份验证的应用程序,但它还需要单独的密码来对其他两项服务进行身份验证。有没有办法使用3个密码来验证登录?我可以为每项服务单独设置登录验证,但我想知道我是否可以在同一个会话中存储所有三个密码。原因是因为用户需要通过多项服务进行身份验证才能使用此应用程序的所有功能。
这就是我在 view.py
中大致做的事情
request.session['pass_kinit2030'] = password
request.session['reg_pass'] = reg_pass
request.session['oraclepass'] = oraclepass
我可以看到几个选项:
- 如果您的 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
,我想他们是不相等的。
- 如果密码不相同,首先在这个应用程序中要求另外 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)
你也可以使用密码作为令牌,只要密码以与令牌类似的方式生成(并且不能更改为用户给定的值 - 我知道这种情况)。
- 最后但同样重要的是,您可能不喜欢令牌的想法,或者可能没有在相关的两个应用程序中实现它们。那么问题来了,这两个app是怎么访问的呢?它们是 HTTP 服务器吗?如果是,那么您已经准备就绪。浏览器应该将登录会话分别保存到另外两个应用程序。而且,如果我们谈论某种 API,您仍然可以重定向到这些应用程序/iframe 或者执行 JavaScript GET 或 POST - 是的,JS 请求将使用登录会话。
我最终使用了多种 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')
我正在创建一个针对 AD 向用户进行身份验证的应用程序,但它还需要单独的密码来对其他两项服务进行身份验证。有没有办法使用3个密码来验证登录?我可以为每项服务单独设置登录验证,但我想知道我是否可以在同一个会话中存储所有三个密码。原因是因为用户需要通过多项服务进行身份验证才能使用此应用程序的所有功能。
这就是我在 view.py
中大致做的事情 request.session['pass_kinit2030'] = password
request.session['reg_pass'] = reg_pass
request.session['oraclepass'] = oraclepass
我可以看到几个选项:
- 如果您的 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
,我想他们是不相等的。
- 如果密码不相同,首先在这个应用程序中要求另外 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)
你也可以使用密码作为令牌,只要密码以与令牌类似的方式生成(并且不能更改为用户给定的值 - 我知道这种情况)。
- 最后但同样重要的是,您可能不喜欢令牌的想法,或者可能没有在相关的两个应用程序中实现它们。那么问题来了,这两个app是怎么访问的呢?它们是 HTTP 服务器吗?如果是,那么您已经准备就绪。浏览器应该将登录会话分别保存到另外两个应用程序。而且,如果我们谈论某种 API,您仍然可以重定向到这些应用程序/iframe 或者执行 JavaScript GET 或 POST - 是的,JS 请求将使用登录会话。
我最终使用了多种 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')