2013-10-25 79 views
1

我想用django進行自定義身份驗證,我寫了一個類,並使用方法authenticate和get_user填充它,我還將此身份驗證添加到settings.py文件中的AUTHENTICATION_BACKENDS。Django自定義身份驗證 -

我已經調用了身份驗證方法,並在我的視圖中對其進行了登錄。

一切似乎都做工精細,

  1. is_authenticated返回登錄後用戶真實,
  2. user.backends設置爲我定製的後端。
  3. 會話ID的Cookie在我的瀏覽器中獲取設置

但隨後的請求都爲匿名,無法找出原因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

您是否找到了解決此問題的方法? – Benjamin

回答

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是否按預期工作

+0

你能解釋一下這個request.session [BACKEND_SESSION_KEY]是什麼嗎? – pravmadh

+0

答覆已更新。代碼取自'django.contrib.auth .__ init __。py',正如我在答案中提到的那樣。您可以檢查'AuthenticationMiddleware'的'django.contrib.auth.middleware.py'並查看它是如何工作的。 – FallenAngel