2009-11-23 66 views
3

因爲我不想使用Django在建造認證系統(也許我應該做的,請告訴我,如果是這樣的話),我創建了一個簡單的小AUTH類:使用django進行自定義身份驗證?

import random 
import hashlib 
from myapp import models 

class CustomerAuth: 
    key = 'customer' 

    def __init__(self, session): 
     self.session = session 

    def attempt(self, email_address, password): 
     password_hash = hashlib.sha1(password).hexdigest() 
     try: 
      return models.Customer.objects.get(
       email_address=email_address, 
       password_hash=password_hash) 
     except models.Customer.DoesNotExist: 
      return None 

    def login(self, customer): 
     self.session[self.key] = customer 

    def logout(self): 
     if self.session.has_key(self.key): 
      self.session[self.key] = None 

    def is_logged_in(self): 
     return self.session.has_key(self.key) 
      and self.session[self.key] != None 

    def get_active(self): 
     if self.is_logged_in(): 
      return self.session[self.key] 
     else: 
      raise Exception('No user is logged in.') 

    def redirect_to_login(self): 
     return HttpResponseRedirect('/login/') 

    def redirect_from_login(self): 
     return HttpResponseRedirect('/account/') 

的問題是,那個時候我想用它來阻止未經授權的訪問,我都用這個代碼片斷中的每一個觀點方法:

def example(req): 
    auth = CustomerAuth(req.session) 
    if not auth.is_logged_in(): 
     return auth.redirect_to_login() 

正如你可以想像,這會產生相當醜陋的和重複的代碼。什麼是更好的方式來做到這一點?我應該使用Django的身份驗證框架嗎?

回答

15

首先,是的,你應該使用Django的身份驗證框架,並建立自己的custom auth backend

其次,無論你做什麼,你都需要在視圖中有一些你想限制訪問的東西。最好的方法是通過視圖上的裝飾器。同樣,Django的內置框架可讓您訪問@login_required裝飾器,它完全符合您的需求。

+0

謝謝 - 現在就實施它。令人驚訝的是,這很容易做到。另外,我不需要使用username屬性,即使它是「必需的」(因爲我想用電子郵件地址進行身份驗證)。 – 2009-11-24 21:18:41