Python相关点

Django 的登录登出功能

2017-01-12  本文已影响359人  SateZheng

CSRF跨域请求保护

A站为正常网站,B站为病毒网站,当我先访问A站,本地浏览器会记录cookies在本地,之后访问B站,B站会窃取我的cookies,然后通过我的cookies就可以冒名访问A站中我的账户。这就是CSRF跨站请求伪造攻击。

Djangoform表单提交时,如果是POST方法提交,会引发CSRF跨域请求保护,解决方法为:在form表单中添加{% csrf_token %},打开网站就会在页面生成token(令牌)来进行认证,当别人登录会,页面会生成完全不一样的token,登录时抓包会发现提交的form表单中会有csrfmiddlewaretoken这么一项。

HTML 的登录表单

<!-- html中的登录表单-->
<form class="form-signin" role="form" method="post" action="{% url 'login' %}">
    {% csrf_token %}
    <h2 class="form-signin-heading">Please sign in</h2>
    <input name="username" type="email" class="form-control" placeholder="Email address" required="" autofocus="">
    <input name="password" type="password" class="form-control" placeholder="Password" required="">
    
    <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
    <span style="color: red" >{{ login_err }}</span>
</form>

登录功能的实现

当点击登录时,会将表单提交到urls.py中的别名为loginurl来处理,如:

...
urlpatterns = [
    ...
    url(r'^login/', views.login_site, name='login'),
    url(r'^logout/', views.logout_site, name='logout'),
]

处理逻辑为:如果方式为Post,获取到提交的usernamepassword,然后通过djangoauthenticate方法来验证。

# 导入的login 和 logout 用来实现保持session
from django.contrib.auth import authenticate, login, logout

def login_site(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(username=username, password=password)   # 使用 Django 的 authenticate 方法来验证
        if user:
            login(request, user)    # <==
            return HttpResponseRedirect('/')
        else:
            return render(request, 'login.html', {
                'login_err': 'Please recheck your username or password !'
            })
    return render(request, 'login.html')

登出功能

def logout_site(request):
    logout(request)     # <==
    return HttpResponseRedirect('/')

HTML 页面验证是否登录

页面中需要根据是否登录来显示登录状态,登录显示登录的用户名,未登录显示login

...
<ul class="nav navbar-nav navbar-right">
    <!-- 验证是否已经登录-->
    <!-- 如果没有登录,则展示登录链接-->
    {% if not request.user.is_authenticated %}
    <li>
        <a href="{% url 'login' %}">Login</a>
    </li>
    {% else %}  
    <!-- 如果已经登录,则展示用户名和下拉菜单-->
    <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false">{{ request.user.name }}<span class="caret"></span></a>
        <ul class="dropdown-menu" role="menu">
            <li><a href="#">个人信息</a></li>
            <li class="divider"></li>
            <li><a href="{% url 'logout' %}">Logout</a></li>
        </ul>
    </li>
    {% endif %}
</ul>
...

强制登录

网站很多页面我们需要用户登录才能展示,或者说打开网站时,必须先登录。可以进行如下两步设置:

第一步:在settings.py文件中写明当用户未登录就访问网站时的跳转路径。

# settings.py 文件中
LOGIN_URL = '/login/'

第二步:在需要登录才能打开的页面中使用login_required装饰器

from django.contrib.auth.decorators import login_required

@login_required
def dashboard(request):
    return render(request, 'dashboard.html')
...
...
上一篇下一篇

猜你喜欢

热点阅读