我正在使用django的默认身份验证系统,但我添加了一个OpenID库,我可以通过OpenID对用户进行身份验证。我想要做的是登录,但似乎使用默认的django auth系统,我需要他们的密码来验证用户。有没有办法绕过这个而不实际使用他们的密码?
我想做这样的事......
user = ... # queried the user based on the OpenID response
user = authenticate(user) # function actually requires a username and password
login(user)
我很快就离开authenticate
函数,但它会附加一个backend
字段,登录时需要该字段。
答案 0 :(得分:22)
为此编写自定义身份验证后端很简单。如果使用以下内容创建yourapp / auth_backend.py:
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User
class PasswordlessAuthBackend(ModelBackend):
"""Log in to Django without providing a password.
"""
def authenticate(self, username=None):
try:
return User.objects.get(username=username)
except User.DoesNotExist:
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
然后添加到您的settings.py:
AUTHENTICATION_BACKENDS = (
# ... your other backends
'yourapp.auth_backend.PasswordlessAuthBackend',
)
在您看来,您现在可以在没有密码的情况下调用身份验证:
user = authenticate(username=user.username)
login(request, user)
答案 1 :(得分:8)
这有点像黑客,但如果你不想重写一堆东西,请删除身份验证
user.backend = 'django.contrib.auth.backends.ModelBackend'
login(request, user)
用户将是您的用户对象
答案 2 :(得分:2)
您可以通过创建自己的authentication backend并将其添加到AUTHENTICATION_BACKENDS
设置来轻松解决此问题。
已经有一些OpenID后端可用,所以通过一些搜索,你可以省去写一个。
答案 3 :(得分:0)
为了不使用密码进行身份验证:
在您的settings.py中:
AUTHENTICATION_BACKENDS = [
# auth_backend.py implementing Class YourAuth inside yourapp folder
'yourapp.auth_backend.YourAuth',
# Default authentication of Django
'django.contrib.auth.backends.ModelBackend',
]
在您的auth_backend.py中:
#如果您有应用的自定义模型,则从.models CustomUser导入
from .models import User
from django.conf import settings
# requires to define two functions authenticate and get_user
class YourAuth:
def authenticate(self, request, username=None):
try:
user = User.objects.get(username=username)
return user
except User.DoesNotExist:
return None
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
在您的视图中用于自定义登录请求:
# Your Logic to login user
userName = authenticate(request, username=uid)
login(request, userName)
有关参考,请参见https://docs.djangoproject.com/en/2.1/topics/auth/customizing/