2017-07-17 102 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