1

我正在尝试使用 django 进行自定义身份验证,我编写了一个类并用方法 authenticate 和 get_user 填充它,我还将此身份验证添加到 settings.py 文件中的 AUTHENTICATION_BACKENDS 中。

我已经调用了身份验证方法,并在我的视图中使用登录来跟进它。

一切似乎都很好,

  1. is_authenticated 在用户登录后返回 true,
  2. user.backends 设置为我的自定义后端。
  3. sessionid cookie 正在我的浏览器中设置

但是后续的请求中 request.user 是匿名的,无法弄清楚原因,需要您的帮助。分享下面的代码,我只是在尝试学习自定义身份验证。

视图.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

可能是什么问题呢 ?

谢谢

普拉文

4

3 回答 3

1

问题已经很老了,也许您找到了答案,但是用户没有为后续请求登录的原因是该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

[文档]

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

于 2018-10-04T17:05:20.393 回答
1

“用户名”字段是您的用户模型的主键吗?get_user 函数应该采用用户模型的主键,如Django 文档所述。

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
于 2020-01-23T22:24:21.747 回答
0

Django 使用以下 (from django.contrib.auth.__init__) 获取登录用户并将其传递AuthenticationMiddleware给 setrequest.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按预期工作

于 2013-10-25T08:00:16.770 回答