我正在尝试使用django进行自定义身份验证,我编写了一个类并使用authenticate和get_user方法填充它,我还将此身份验证添加到了settings.py文件中的AUTHENTICATION_BACKENDS。
我已经调用了authenticate方法,并在我的视图中使用登录进行了跟踪。
一切似乎都很好,
但随后的请求有request.user匿名,无法弄清楚原因,需要你的帮助。分享下面的代码,我只是尝试学习自定义身份验证。
views.py
def home(request):
if not request.user.is_authenticated():
user=authenticate(username=None,passwd=None,request=request)
if not user:
return HttpResponse("Login Failed")
else:
login(request,user)
return HttpResponse("Logged in Successfully")
cusauth.py
class CustomloginBackend:
def authenticate(self,username=None,passwd=None,request=None):
return self.get_user("praveen.madhavan")
def get_user(self,username):
try:
return User.objects.get(username=username)
except Exception as e:
return False
可能是什么问题?
由于
Praveen.M
答案 0 :(得分:1)
“用户名”字段是用户模型的主键吗? get_user函数应采用Django document所述的用户模型主键。
get_user方法采用一个user_id(可以是用户名,数据库ID或其他名称,但必须是用户对象的主键),并返回用户对象或None。
因此,在您的情况下,如果用户名是模型的PK,只需更改User.objects.get的关键字参数。
def get_user(self,username):
try:
return User.objects.get(pk=username)
except Exception as e:
return None
或者如果用户名不是PK,请尝试以下操作:
def get_user(self,user_id):
try:
return User.objects.get(pk=user_id)
except Exception as e:
return None
答案 1 :(得分:0)
Django使用以下内容(来自django.contrib.auth.__init__
)来登录用户并将其传递给AuthenticationMiddleware
以设置request.user
SESSION_KEY = '_auth_user_id'
BACKEND_SESSION_KEY = '_auth_user_backend'
def get_user(request):
from django.contrib.auth.models import AnonymousUser
try:
user_id = request.session[SESSION_KEY]
backend_path = request.session[BACKEND_SESSION_KEY]
backend = load_backend(backend_path)
user = backend.get_user(user_id) or AnonymousUser()
except KeyError:
user = AnonymousUser()
return user
可能是您将错误的值传递给backend.get_user
,因此无法检索到正确的用户,因此请设置AnonymousUser
进行请求。您可以尝试调试以查看backend.get_user
是否按预期工作
答案 2 :(得分:0)
问题已经很老了,也许您找到了答案,但是用户未登录后续请求的原因是,authenticate
方法不会将经过身份验证的用户保存在会话中,因为您需要从同一模块进行身份验证后,请使用login
方法。
来自文档:
def authenticate(request=None, **credentials):
"""
If the given credentials are valid, return a User object.
"""
def login(request, user, backend=None):
"""
Persist a user id and a backend in the request. This way a user doesn't
have to reauthenticate on every request. Note that data set during
the anonymous session is retained when the user logs in.
"""
[来源]
https://docs.djangoproject.com/en/2.1/_modules/django/contrib/auth/#authenticate
[docs]
https://docs.djangoproject.com/en/2.1/topics/auth/default/#django.contrib.auth.authenticate
https://docs.djangoproject.com/en/2.1/topics/auth/default/#django.contrib.auth.login