django-registration定制后端

时间:2013-05-10 12:42:48

标签: django authentication registration django-registration

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

  

用户对象没有属性后端

我的注册后端:

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

然后我的auth后端:

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()或者其他东西

1 个答案:

答案 0 :(得分:0)

尝试按specifying authentication backends

上的文档中所述设置AUTHENTICATION_BACKENDS设置

然后,在您的register方法中,使用django.contrib.auth.authenticate方法登录(请参阅how to log a user in),而不是手动实例化后端实例。该验证方法应该注意设置用户backend属性,因此您不应该收到任何错误。

相关问题