'User'对象没有is_authenticated属性

时间:2012-11-02 23:21:06

标签: django django-authentication middleware django-middleware

我为我的django app创建了一个User模型

class User(Model):
    """
    The Authentication model. This contains the user type.  Both Customer and
    Business models refer back to this model.
    """
    email = EmailField(unique=True)
    name = CharField(max_length=50)
    passwd = CharField(max_length=76)
    user_type = CharField(max_length=10, choices=USER_TYPES)
    created_on = DateTimeField(auto_now_add=True)
    last_login = DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.email

    def save(self, *args, **kw):
        # If this is a new account then encrypt the password.
        # Lets not re-encrypt it everytime we save.
        if not self.created_on:
            self.passwd = sha256_crypt.encrypt(self.passwd)
        super(User, self).save(*args, **kw)

我还创建了一个认证中间件来使用这个模型。

from accounts.models import User
from passlib.hash import sha256_crypt

class WaitformeAuthBackend(object):
    """
    Authentication backend fo waitforme
    """

    def authenticate(self, email=None, password=None):
        print 'authenticating : ', email
        try:
            user = User.objects.get(email=email)
        except User.DoesNotExist:
            user = None

        if user and sha256_crypt.verify(password, user.passwd):
            return user
        else:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

我已经正确修改了settings.py文件,如果我在这个后端添加一些打印语句,我可以看到打印出的用户详细信息。我不记得读过我需要在django文档中实现is_authenticated。我错过了一些傻事吗?

2 个答案:

答案 0 :(得分:4)

我不太清楚为什么你创建了一个新的User模型而不是使用Django的内置模型并添加一个链接的UserProfile,这是推荐的事情(直到1.5发布,当可插入的用户模型将是可用)。但是,是的,您需要定义一个is_authenticated方法,该方法始终返回True:这正是内置模型所做的。原因是如果你有一个实际的用户,它将始终被验证:否则,你将有一个AnonymousUser对象,其is_authenticated方法总是返回False。

答案 1 :(得分:2)

你不必重新发明轮子。只需使用Djangos构建身份验证系统,就可以省去很多麻烦。您还可以将其扩展到您的需要或使用不同的身份验证后端。 Have a read here。 HTH。