2013-03-20 2 views
1

Я использую Django 1.5. Я пользовательская модель пользователя, как это:check_password всегда возвращает false, даже если пароль верен?

class User(AbstractBaseUser): 
    #id = models.IntegerField(primary_key=True) 
    #identifier = models.CharField(max_length=40, unique=True, db_index=True) 
    username = models.CharField(max_length=90, unique=True, db_index=True) 
    create_time = models.DateTimeField(null=True, blank=True) 
    update_time = models.DateTimeField(null=True, blank=True) 
    email = models.CharField(max_length=225) 
    #password = models.CharField(max_length=120) 
    external = models.IntegerField(null=True, blank=True) 
    deleted = models.IntegerField(null=True, blank=True) 
    purged = models.IntegerField(null=True, blank=True) 
    form_values_id = models.IntegerField(null=True, blank=True) 
    disk_usage = models.DecimalField(null=True, max_digits=16, decimal_places=0, blank=True) 
    objects = UserManager() 
    USERNAME_FIELD = 'email' 
    class Meta: 
     db_table = u'galaxy_user' 

У меня есть пользовательская проверка подлинность:

class AuthBackend: 

def authenticate(self, username=None, password=None): 
    if '@' in username: 
     kwargs = {'email': username} 
    else: 
     kwargs = {'username': username} 
    try: 
     user = User.objects.get(**kwargs) 
     if user.check_password(password): 
      return user 
    except User.DoesNotExist: 
     return None 

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

Даже после ввода правильного имени пользователя и пароль check_password() всегда возвращается ложным, так что я не могу войти , Я попытался, что в терминале тоже:

user.check_password(password) 

всегда возвращается False.

#views.py: 

def login_backend(request): 
    if request.method == 'POST': 
     username = request.POST['username'] 
     password = request.POST['password'] 
     user = authenticate(username=username, password=password) 
     state = "Username or Password Incorrect!" 
     if user is not None: 
      login(request, user) 
      return HttpResponseRedirect('/overview/') 
     else: 
      return render_to_response('login_backend.html', {'state':state}, context_instance=RequestContext(request)) 
    else: 
     return render_to_response('login_backend.html', context_instance=RequestContext(request)) 
+0

Да выглядит следующим образом: f8566297ee28e8a3096497070b37b91d24c2 в базе данных. – pynovice

+0

Сделал это: пользователь возвращается с пользователем = User.objects.get (** kwargs) возвращает имя пользователя, но после того, как пользователь user.check_password (password) возвращает false. В основном это аутентификация с именем пользователя, но не с паролем. – pynovice

+0

Хорошо, конечно. дай мне секунду. – pynovice

ответ

2

Проблема заключается в том, что при создании CustomUser, вы сохраните пароль в открытом способом (без перемешивания). Можете ли вы дать мне свой код RegistrationForm?

В моем случае:

# forms/register.py 
class RegistrationForm(forms.ModelForm): 
    """ 
    Form for registering a new account. 
    """ 
    class Meta: 
     model = CustomUser 
     fields = ['username', 'password', 'email'] 

Регистрация обработчика:

# views.py 
def register(request): 
    """ 
    User registration view. 
    """ 
    if request.method == 'POST': 
     form = RegistrationForm(data=request.POST) 
     if form.is_valid(): 
      user = form.save() # Save your password as a simple String 
      return redirect('/') 
    else: 
     form = RegistrationForm() 
    return render(request, 'news/register.html', {'form': form}) 

Так, при попытке войти в систему:

if user.check_password(password): 
    return user 

check_password всегда возвращает значение False.


Решение: Чтобы установить пароль правильно, вы должны переопределить метод сохранения() в RegistrationForm:

# forms/register.py 
class RegistrationForm(forms.ModelForm): 
    """ 
    Form for registering a new account. 
    """ 
    class Meta: 
     model = CustomUser 
     fields = ['username', 'password', 'email'] 

    def save(self, commit=True): 
     user = super(RegistrationForm, self).save(commit=False) 
     user.set_password(user.password) # set password properly before commit 
     if commit: 
      user.save() 
     return user 

Или просто изменить обработчик:

def register(request): 
    """ 
    User registration view. 
    """ 
    if request.method == 'POST': 
     form = RegistrationForm(data=request.POST) 
     if form.is_valid(): 
      user = form.save(commit=False) 
      user.set_password(request.POST["password"]) 
      user.save() 
      return redirect('/') 
    else: 
     form = RegistrationForm() 
    return render(request, 'news/register.html', {'form': form}) 

См. Больше на http://www.blackglasses.me/2013/09/17/custom-django-user-model/

и http://www.blackglasses.me/2013/10/08/custom-django-user-model-part-2/

Смежные вопросы