使用django进行自定义身份验证?

时间:2009-11-23 10:59:59

标签: django authentication

因为我不想使用Django的内置身份验证系统(也许我应该这样做,请告诉我是否是这种情况),我创建了一个简单的小型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()

你可以想象,这会产生相当丑陋和重复的代码。这样做的更好方法是什么?我应该使用Django的auth框架吗?

1 个答案:

答案 0 :(得分:15)

首先,是的,您应该使用Django的身份验证框架,并构建您自己的custom auth backend

其次,无论如何,您都需要在视图中包含要限制访问权限的内容。最好的方法是通过视图上的装饰器。同样,Django的内置框架允许您访问@login_required装饰器,它完全符合您的要求。