2017-07-17 158 views
0

我正在一個項目,我已經創建了新用戶的用戶登錄功能。一旦用戶創建帳戶,我遇到登錄系統問題。用戶登錄系統不哈希和比較密碼與記錄Django

問題是,當創建新帳戶時,django會對密碼進行散列處理。我認爲,當我嘗試登錄其中一個帳戶時,它不會散列密碼,然後檢查密碼是否匹配。

那是正在發生的事情或者是說我所做的東西..

這裏是views.py文件:

def login_page(request): 
    if request.method == 'POST': 
     form = LoginForm(request.POST) 
     if form.is_valid(): 
      cd = form.cleaned_data 
      username = cd['username'] 
      password = cd['password'] 
      valid_user = User.objects.get(username=username) 
      if valid_user: 
       if password == valid_user.password: 
        request.session['username'] = username 
        return redirect('/') 
       else: 
        message = 'Password does not match the username' 
      else: 
       message = 'Invalid Username' 
      parameters = { 
       'message':message, 
       'form':form, 
      } 
      return render(request, 'tabs/login.html', parameters) 
    else: 
     form = LoginForm() 
     message = 'Login Below' 
     parameters = { 
      'form':form, 
      'message':message, 
     } 
     return render(request, 'tabs/login.html', parameters) 

HTML文件:

{% extends "base.html" %} 

{% block content %} 
    <h1>Login</h1> 
    <p>{{ message }}</p> 
    <form method="POST"> 
     {% csrf_token %} 
     {{ form.as_p }} 
     <input type="submit" name="submit" value="submit"> 
    </form> 
{% endblock %} 

形式.py文件:

class LoginForm(forms.Form): 
    username = forms.CharField(max_length=22) 
    password = forms.CharField(max_length=22, widget=forms.PasswordInput) 

下面是一些我創建的用戶和密碼...

steven -- pbkdf2_sha256$20000$z2DdGDm5D8Yu$v0nwWWj/2qslNUUTmYMd1ePBqyjpHoWM76AY5k11f9o= 

josh -- pbkdf2_sha256$20000$cMy01yE10w7I$O39pRqQsb/se+E8ttvEn9JRlb8qB4xrfS1GRKQKHA2Q= 

Moe -- pbkdf2_sha256$20000$hJysyabGcxpP$As4cvzWu2x+YjJ4RvP8EjS2dxhusQwuTlPvS7av35Ys= 

omarjandali -- hellohello 

回答

0

我完全同意NeErAj KuMaR。而且您不需要登錄forms。只是保持簡單。

# views.py 

from django.contrib import auth 

def login_page(request): 
    if request.method == 'POST': 
     username = request.POST['username'] 
     password = request.POST['password'] 
     user = auth.authenticate(username=username, password=password) 
     if user: 
      auth.login(request, user) 
     else: 
      message = 'Invalid Username' 
    parameters = { 
     'message':message, 
    } 
    return render(request, 'tabs/login.html', parameters) 

現在,修改代碼的login.html

# login.html 

... 
<form method="POST"> 
    {% csrf_token %} 
    <input type="text" name="username"> 
    <input type="password" name="password"> 
    <input type="submit" name="submit" value="submit"> 
</form> 
... 
+0

問題。我在創建帳戶時以及用戶登錄時所做的操作,它將用戶名保存在會話中,並且在他們註銷時將用戶名帶出會話,並且每個頁面都會檢查用戶名是否在會話中。是該方法或更好地在django中使用auth.login方法... –

+0

另外如果我使用auth.authentication @Simplans –

+0

什麼將是導入語句如果你想檢查用戶是否登錄或不使用此代碼「如果request.user.is_authenticated():」 – Simplans

0

你需要使用Django身份驗證方法檢查密碼

from django.contrib.auth import authenticate, login 
user = authenticate(request, username=username, password=password) 

if user is not None: 
    login(request, user) # Redirect to a success page. ... 

else: 
    # invalid password 
0

切勿檢查RAW密碼!!!

Django的具有先天的密碼驗證,所以你不得不使用它,而不是讓你自己(尤其是不保存原始密碼!!!!)

出於安全原因,你不應該保存用戶的密碼生的。

當您使用django的用戶(如auth.User)時,django會使用salt以SHA2加密用戶密碼30,000次。這意味着在查找數據庫的密碼列時,沒有人可以讀取原始密碼。

如果你讓自己的用戶模式,我建議你用你這樣的代碼:

# maybe in your views.py 
def authenticate(self, username=None, password=None): 
     UserModel = get_user_model() 
     user = UserModel.objects.get(username=username) 
     if user.check_password(password) and self.user_can_authenticate(user): 
      return user 

如果你使用Django的用戶模型(auth.User),只需使用authenticate功能auth.User,嘗試這樣的:

從django.contrib.auth進口身份驗證,登錄

# your views.py 
def my_view(request): 
    username = request.POST['username'] 
    password = request.POST['password'] 
    user = authenticate(request, username=username, password=password) 
    if user is not None: 
     login(request, user) 
     # Redirect to a success page. 
     ... 
    else: 
     # Return an 'invalid login' error message. 
     ... 

選中此:https://docs.djangoproject.com/en/1.11/topics/auth/default/#how-to-log-a-user-in