0

我已经成功实现了我的 auth/login 自定义后端,现在我正在尝试实现我自己的 django-registration 自定义后端。如果我使用来自 contrib.auth 的正常身份验证,django-registration 代码似乎工作正常。如果没有(在我的情况下,我想使用我自己新创建的自定义身份验证)我得到一个

用户对象没有属性后端

.

我的注册后端:

from django.conf import settings
#from django.contrib.auth import authenticate
from django.contrib.auth import login

from registration import signals
from registration.forms import RegistrationForm
class MyRegistrationBackend(object):

    def register(self, request, **kwargs):
        """
        Create and immediately log in a new user.

        """
        print "debug"
        username, email, password = kwargs['username'], kwargs['email'], kwargs['password1']
        User.objects.create_user(username, email, password)

        # authenticate() always has to be called before login(), and
        # will return the user we just created.

        auth = MyAuthBackend()

        new_user = auth.authenticate(username=username, password=password)
        login(request, new_user)
        signals.user_registered.send(sender=self.__class__,
                                     user=new_user,
                                     request=request)
        return new_user

然后我的身份验证后端:

class MyAuthBackend(object):
    """
    Authenticates against django.contrib.auth.models.User. with my modifications
    """
    supports_inactive_user = True

    """
    This function does not upgrade the user password hasher
    """
    def check_password(self,password, encoded):
        if not password or not is_password_usable(encoded):
            return False

        password = smart_str(password)
        encoded = smart_str(encoded)

        if encoded[0] == "$":
            encoded = encoded[1:]   #make it compatible so that drupal 7 sha512 hasher can work properly

        if len(encoded) == 32 and '$' not in encoded:
            hasher = get_hasher('unsalted_md5')
        else:
            algorithm = encoded.split('$', 1)[0]          
            hasher = get_hasher(algorithm)

        is_correct = hasher.verify(password, encoded)

        return is_correct

    def authenticate(self, username=None, password=None):
        try:
            user = User.objects.get(username=username)
            if self.check_password(password, user.password):
                return user
        except User.DoesNotExist:
            return None

有任何想法吗??我相信也许我正在auth = MyAuthBackend()以错误的方式实例化..或者它可能是别的东西

4

1 回答 1

0

尝试按照有关指定身份验证后端AUTHENTICATION_BACKENDS的文档中所述设置设置

然后,在您的 register 方法中,使用该django.contrib.auth.authenticate方法登录(请参阅如何登录用户),而不是手动实例化后端实例。该身份验证方法应该负责设置用户backend属性,因此您不应该遇到任何错误。

于 2013-05-10T12:56:36.087 回答