【问题标题】:django-registration custom backenddjango-registration 自定义后端
【发布时间】:2013-05-05 03:41:56
【问题描述】:

我已经成功实现了我的 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

然后是我的身份验证后端:

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().. 或者它可能是别的东西

【问题讨论】:

    标签: django authentication registration django-registration


    【解决方案1】:

    尝试按照specifying authentication backends 上的文档中所述设置AUTHENTICATION_BACKENDS

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

    【讨论】:

      猜你喜欢
      • 2012-05-06
      • 2011-06-23
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 2013-09-09
      • 2016-04-21
      相关资源
      最近更新 更多