Django自定义身份验证 -

时间:2013-10-25 07:37:28

标签: django django-authentication

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

我已经调用了authenticate方法,并在我的视图中使用登录进行了跟踪。

一切似乎都很好,

  1. is_authenticated在登录后为用户返回true,
  2. user.backends设置为我的自定义后端。
  3. 在我的浏览器中设置了sessionid cookie
  4. 但随后的请求有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

3 个答案:

答案 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