2009-11-23 6 views
3

Django의 in-build 인증 시스템을 사용하고 싶지 않았기 때문에 (아마도 내가해야 할 것입니다.이 경우에 대해 알려주십시오.) 간단한 간단한 auth 클래스를 만들었습니다 :장고와 사용자 정의 인증?

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() 

상상할 수 있듯이이 코드는 상당히 추악하고 반복적 인 코드를 생성합니다. 이 일을하는 더 좋은 방법은 무엇입니까? 장고의 인증 프레임 워크를 사용해야합니까?

답변

15

먼저, 장고의 인증 프레임 워크를 사용해야하며 직접 custom auth backend을 만들어야합니다.

두 번째로 액세스 권한을 제한하려는보기에 뭔가가 있어야합니다. 가장 좋은 방법은보기의 데코레이터를 사용하는 것입니다. 다시 말하지만 Django의 기본 제공 프레임 워크를 사용하면 정확히 원하는 것을 수행하는 @login_required 데코레이터에 액세스 할 수 있습니다.

+0

감사합니다. 지금 구현했습니다. 놀랍게도 실제로 실제로는 매우 쉽습니다. 게다가, 이메일 주소로 인증을하기 때문에 "필수"를 통해서도 사용자 이름 속성을 사용할 필요가 없습니다. –

관련 문제