2011-04-10 13 views
3

我有一個django應用程序,我想添加自己的auth驗證並檢查用戶是否過期(檢查我的某些模型的過期日期)。如果用戶過期,我想在適當的消息中在登錄頁面中引發ValidationError。什麼是最好的方式來做到這一點?在Django中添加auth驗證

謝謝,亞歷克斯

+0

django.contrib.auth在哪裏缺少你所需要的? – jbcurtin 2011-04-10 09:02:12

+0

我需要檢查我的某個模型中的過期日期,並在用戶嘗試登錄時過期並給出相應的錯誤。 – alexarsh 2011-04-10 09:56:09

+0

好的,通常它是在使用auth模塊的應用程序視圖中完成的。另一種方法是創建一個可以覆蓋objects.get()並執行檢查的管理器。擴展認證模塊的唯一主要好處是你已經有了一個經過測試和工作的cookie驗證實現,它已經支持你所需要的。看看這裏一些額外的閱讀:http://docs.djangoproject.com/en/dev/topics/http/sessions/#using-sessions-in-views – jbcurtin 2011-04-10 20:41:38

回答

2

如果你真的想這樣做你自己的自定義身份驗證,則應該在Django文檔閱讀custom backends

雖然你可能不想自己做。它很爛。真。除非真的有很好的理由,否則你應該避免自己的認證。主要原因是,如果你不使用內置的用戶模型,許多Django應用程序停止工作。如果您需要對現有源進行身份驗證,那麼這是創建自己的後端的有效原因。但是有些陷阱,你仍然可能想要爲你的自定義後端使用內置的用戶模型。

您應該告訴我們您爲什麼要進行自己的自定義身份驗證,也許我們可以幫助您實現自己的要求,而無需編寫自定義後端。

編輯

好吧,我想我明白你的意思了。你想要什麼(我認爲)是一種自定義身份驗證表單。我們目前使用自定義表單(儘管我們有不同的不可避免的後端),所以你應該能夠很容易地使用以下內容。

from django.contrib.auth.forms import AuthenticationForm 
from django import forms 
from myproject.myapp.models import MyClass 

class CustomAuthForm(AuthenticationForm): 

    def clean(self): 
     cleaned_data = super(CustomAuthForm, self).clean() 
     user = self.user_cache # set by super class 
     if user.my_class.expired: 
      raise forms.ValidationError('This User has Expired!') 
     return cleaned_data 

然後,使用這個定製驗證表單,你需要在你urls.py網址:

from myproject.myapp.forms import CustomAuthForm 

url(r'^login/$', 'django.contrib.auth.views.login', name='login', 
    kwargs={'template_name':'youproject/login.html', 'authentication_form':CustomAuthForm}), 

我現在是你的問題本來規定你想自定義的驗證,沒有驗證,請參閱。我的道歉沒有正確地讀你的問題。

+0

非常感謝您的快速回復。我想禁用過期用戶的訪問權限。有一個管理員用戶設置了用戶的到期日期,如果用戶已過期,我想在他嘗試登錄時向他顯示適當的消息。 – alexarsh 2011-04-10 09:44:09

+0

@alex,那麼您是否使用自定義用戶模型來執行此操作? – 2011-04-10 11:22:33

+0

不,我使用django的用戶模型 – alexarsh 2011-04-11 09:47:25

相關問題