2012-05-03 94 views
1

我將我的Django應用程序部署到遠程服務器,但tastypie無法識別遠程服務器上的登錄用戶。Tastypie將登錄用戶識別爲AnonymousUser

我有一個過濾器屬於在當前登錄用戶的所有對象tastypie資源:

def apply_authorization_limits(self, request, object_list): 
    return object_list.filter(user=request.user) 

當我嘗試做的端點對象的GET請求,我得到以下錯誤:

int() argument must be a string or a number, not 'AnonymousUser 

我猜測是因爲登錄無法正常工作?

還是做了?在模板頁,我有以下代碼:

{% if user.is_authenticated %} 
    Logged in as <strong>{{ user.username }}</strong> 
    <a href="https://stackoverflow.com/users/logout">Logout</a> 
{% else %} 
    <a href="https://stackoverflow.com/users/signup">Signup</a> 
    <a href="https://stackoverflow.com/users/login">Login</a> 
{% endif %} 

和代碼正確地顯示用戶的用戶名(這意味着該用戶已被認證)。會發生什麼?在我的本地服務器上,我能夠成功完成對tastypie API的所有HTTP請求,並且我不稱爲AnonymousUser,但在我的遠程服務器上,我被稱爲AnonymousUser to Tastypie

編輯: 當我有一個打印語句打印出request.user在任何視圖中,我得到正確的登錄用戶。當我在打印出request.user的Tastypie api.py中有打印語句時,我稱爲AnonymousUser。爲什麼我會被稱爲AnonymousUser而不是Tastypie的其餘部分?

編輯: 我使用以下驗證:

authentication = Authentication() 

如果我改變了身份驗證ApiKeyAuthentication,那麼我將不得不張貼在每個GET/POST請求到資源的用戶名和API密鑰。這樣做的問題是,我將不得不創建一個新的中間視圖,查詢用戶名和視圖,然後對Tastypie端點執行GET/POST。有沒有另一種解決方案呢? 第二種方法是將用戶名和apikey嵌入到webapp中,並讓JS獲取這些值並將它們添加到GET/POST查詢字符串中,但這可能會導致安全問題。這將是一個安全問題,因爲如果用戶擁有自己的用戶名和api密鑰,用戶可以僞裝成另一個用戶。

+0

你如何向'tastypie'發出請求?它是AJAX還是其他?什麼確切的URL在登錄時以及何時是匿名時請求?他們在完全相同的域名? – ilvar

+0

我通過AJAX製作它們。如果用戶登錄或用戶是匿名的,則URLS是相同的。 Tastypie處理用戶登錄或未登錄的情況。請求來自同一個域。 – egidra

+0

我幾乎可以肯定有些東西會阻止sessionid sookie到達服務器。看看您在Firebug(或網絡檢查員)的請求,他們是否包含sessionid cookie? – ilvar

回答

1

第一個:APIKeyAuth:與另一個用戶通過不安全的連接獲取用戶名和密碼或會話標識一樣,這是一個問題。

第二:如果你想使用基於會話的認證(它只能在瀏覽器中,爲當前登錄用戶),您將需要創建自己的認證後端,這是在文檔在http://django-tastypie.readthedocs.org/en/latest/authentication_authorization.html#implementing-your-own-authentication-authorization

詳細然後從那裏向上滾動一下,然後閱讀有關您選擇的身份驗證方法的令人討厭的警告。

+0

我將如何推出基於會話的身份驗證?我相信會話不會自動包含有關當前登錄用戶的信息(或者是否?)這意味着我必須從我的自定義身份驗證中訪問request.user。但是,我無法做到這一點,因爲當我嘗試從我的自定義身份驗證後端訪問request.user時,我找回了AnonymousUser。 – egidra

+0

沒關係,我只是在Javascript標籤內添加了用戶名和API密鑰,所以我可以在頁面的其餘部分訪問它。 – egidra