我已经成功实现了我的 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()
以错误的方式实例化..或者它可能是别的东西