2017-08-17 35 views
0

我有一個奇怪的情況:DJANGO backend.authenticate(* ARGS,**憑證)返回無

  • 我有一個自定義的用戶模型,連接到一個註冊表格,我做set_password(密碼)在將其保存到數據庫之前,它會使用argon2進行哈希處理,並將其正確保存到數據庫中。我檢查了。

  • check_password(password)在驗證用戶名和密碼時工作得很好。

auth.authenticate(username=username, password=password) 

返回None。當Pycharm調試,我看到的用戶名和密碼得到正確傳遞,但它的失敗在這一點上:

backend.authenticate(*args, **credentials) 

裸記住,我第一次從數據庫中獲取用戶是否在場,所以問題出在我猜測的密碼上,但無法弄清楚原因。另外, login(request, user)也不工作。

沒有例外沒有什麼,他們都只是沒有返回。

任何人,爲了編碼的愛幫助我嗎?

下面的代碼:

形式:

class SignUpForm(forms.ModelForm): 

def __init__(self, *args, **kwargs): 
    super(SignUpForm, self).__init__(*args, **kwargs) 
    self.fields['first_name'].widget.attrs['placeholder'] = 'first name' 
    self.fields['username'].widget.attrs['placeholder'] = 'username' 
    self.fields['email'].widget.attrs['placeholder'] = 'email' 

password = forms.CharField(widget=forms.PasswordInput(attrs={ 
    'placeholder': 'password' 
})) 

class Meta: 
    # points the form to the model to use 
    model = MyUser 
    fields = [ 
     'first_name', 
     'username', 
     'email', 
    ] 

def save(self, commit=True): 
    user = super(SignUpForm, self).save(commit=False) 
    user.set_password(self.cleaned_data["password"]) 
    if commit: 
     user.save() 
    return user 

在註冊視圖:

def signup(request): 
context = {} 

if request.method == "POST": 
    form = SignUpForm(request.POST) 
    if form.is_valid(): 
     form.save() 
     return HttpResponseRedirect(reverse('activate')) 

else: 
    form = SignUpForm() 

response = render(request, 'signup.html', context={'form': form}) 
return response 

鑑於符號:

def signin(request): 

form = SignInForm() 
context = { 
    'form': form 
} 

if request.method == "POST": 
    if request.method == "POST": 
     username = request.POST.get('username') 
     password = request.POST.get('password') 

    if not get_or_none(MyUser, username=username): 
     context['user_not_found_message'] = 'Invalid Credentials - username' 

    else: 
     user = authenticate(username=username, password=password) 
     login(request, user) 
     if not user: 
      context['user_not_found_message'] = 'Invalid Credentials - password' 
     elif not user.is_active: 
      return HttpResponseRedirect(reverse('activate')) 
     else: 
      return HttpResponseRedirect(reverse('landingpage')) 

response = render(request, 'signin.html', context=context) 
return response 

get_or_none是一個方法我創建和工作只是fin e,並返回正確的用戶。我做user.password它給了我散列通行證。

+0

你確實需要真正顯示該代碼。 –

+0

@DanielRoseman完成了 –

回答

0

解決:

我調試的核心Django的圖書館,並注意到在backends.py代碼如下:

def authenticate(self, request, username=None, password=None, **kwargs): 
    if username is None: 
     username = kwargs.get(UserModel.USERNAME_FIELD) 
    try: 
     user = UserModel._default_manager.get_by_natural_key(username) 
    except UserModel.DoesNotExist: 
     # Run the default password hasher once to reduce the timing 
     # difference between an existing and a non-existing user (#20760). 
     UserModel().set_password(password) 
    else: 
     if user.check_password(password) and self.user_can_authenticate(user): 
      return user 

因此,因爲我的用戶是不活躍,就無法驗證