2009-11-23 4 views
3

Parce que je ne voulais pas utiliser le système d'authentification de Django en construction (peut-être que je devrais faire, s'il vous plaît me dire si cela est le cas), je crée une classe peu auth simple:Authentification personnalisée avec 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/') 

Le problème est , que lorsque je veux l'utiliser pour arrêter l'accès non autorisé, j'utiliser cet extrait de code dans chaque méthode de vue unique:

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

Comme vous pouvez l'imaginer, cela donne un code assez laid et répétitif. Quelle est la meilleure façon de le faire? Dois-je utiliser le framework d'authentification de Django?

Répondre

15

Tout d'abord, oui, vous devriez utiliser le framework d'authentification de Django et créer votre propre custom auth backend. Deuxièmement, cependant, vous aurez besoin de quelque chose dans les vues dont vous voulez restreindre l'accès. La meilleure façon de le faire est via un décorateur sur la vue. Encore une fois, le framework intégré de Django vous donne accès au décorateur @login_required, qui fait exactement ce que vous voulez.

+0

Merci - juste mis en œuvre maintenant. C'est en fait très facile à faire de façon surprenante. De plus, je n'ai pas besoin d'utiliser l'attribut de nom d'utilisateur même si c'est "requis" (puisque je veux faire l'authentification avec les adresses e-mail). –

Questions connexes