Django基础7——用户认证系统、Session管理、CSRF安全防护机制

这篇具有很好参考价值的文章主要介绍了Django基础7——用户认证系统、Session管理、CSRF安全防护机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、用户认证系统

  • Django内置一个用户认证系统,使用auth模块实现。
  • auth模块提供了登录、注册、效验、修改密码、注销、验证用户是否登录等功能。
    Django基础7——用户认证系统、Session管理、CSRF安全防护机制,python开发,django,csrf,安全,python,linux
  • Django默认创建的数据库表。
表名 作用
auth_user 用户表
auth_user_groups 用户所属组的表
auth_user_user_permissions 用户权限表
auth_group 用户组表
auth_group_permissions 用户组权限表
auth_permission 存放全部权限的表,其他的表的权限都是从此表中外键连接过去的
django_session 保存HTTP状态
django_migrations 数据库迁移记录

二、案例:登陆认证

2.1 平台登入

1.登陆成功,进入平台首页;登陆失败,返回错误信息。

###################################################
1、定义url路由规则,ORM/urls.py文件。
from django.contrib import admin
from django.urls import path,include,re_path
from ORM import views
urlpatterns = [
    path('admin/', admin.site.urls),
    re_path('^$',views.home),
    path('myapp/',include('myapp.urls')),
    path('login/',views.login)
]
###################################################
2、定义视图,ORM/views.py文件。
from django.shortcuts import render,HttpResponse,redirect
from django.contrib import auth
def home(request):
    return render(request,'index.html')
def login(request):
    if request.method == "GET":
        return render(request, 'login.html')
    elif request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = auth.authenticate(username=username, password=password)
        if user:
            ##验证通过后,将session信息保存到数据库中。
            auth.login(request, user)   
            return redirect("/")
        else:
            msg = "用户名或密码错误!"
            return render(request,'login.html',{'msg':msg})
###################################################
3、定义html模板,templates/login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>管理后台页面</title>
</head>
<body>
<ht>欢迎访问管理后台</ht>
<form action="" method="post">
    用户名 : <input type="text" name="username"><br>
    密码 : <input type="text" name="password"><br>
    <button type="submit">登录</button>
    <span style="color: red">{{ msg }}</span>
</form>
</body>
</html>
###################################################
4、平台首页渲染模板templates/index.html,新增”退出登录“按钮。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>平台首页</title>
</head>
<body>
<h1>网站首页</h1>
<a href="/logout"><button>退出登录</button></a>
</body>
</html>

2.进入django管理后台,新增一个测试用户xiaoming,添加auth权限。
Django基础7——用户认证系统、Session管理、CSRF安全防护机制,python开发,django,csrf,安全,python,linux
3.测试效果。
Django基础7——用户认证系统、Session管理、CSRF安全防护机制,python开发,django,csrf,安全,python,linux
Django基础7——用户认证系统、Session管理、CSRF安全防护机制,python开发,django,csrf,安全,python,linux

2.2 平台登出

  • 就是清空django_session表中记录的用户登录状态信息,若数据存在该表中,则认定处于登陆状态;删除数据,则认定登出。

1.退出登录,返回到登陆页面。

###################################################
1、定义url路由规则,ORM/urls.py文件。
from django.contrib import admin
from django.urls import path,include,re_path
from ORM import views
urlpatterns = [
    path('admin/', admin.site.urls),
    re_path('^$',views.home),
    path('myapp/',include('myapp.urls')),
    path('login/',views.login),
    path('logout/',views.logout),   ##新增url
]
###################################################
2、新增视图,ORM/views.py文件。
def logout(request):
    # 清除当前用户的session信息
    auth.logout(request)
    return redirect('/login')

2.3 login_required装饰器

  • login_required装饰器:判断用户是否登录,如果没有登录引导至登录页面,登录成功后跳转到目的页面。

1.在settings.py文件设置没有登录默认跳转页面。

##文件末尾添加。
LOGIN_URL = '/login/'

2.在需要登录后才能访问页面的视图添加装饰器。

from django.contrib.auth.decorators import login_required

@login_required()    ##语法糖引用装饰器。
def user_add(request):
      ......
      ......

3.效果验证。
Django基础7——用户认证系统、Session管理、CSRF安全防护机制,python开发,django,csrf,安全,python,linux

三、Django Session管理

Session与Cookie是什么?

  • 网站采用是HTTP协议,它本身就是一个无状态的,记不住我们上次来浏览器上做了什么事。
  • 这时,服务器给每个用户贴了一个小纸条,上面记录了服务器给我们返回的一些信息。后面服务器看到这张小纸条就知道我们是谁了。
  • 这个小纸条就是Cookie。

Cookie工作原理:

  1. 浏览器第一次访问服务器时,服务器此时肯定不知道它的身份,所以创建一个独特的身份标识数据,格式为key=value,放入到Set-Cookie字段里,随着响应报文发给浏览器。
  2. 浏览器看到有Set-Cookie字段以后就知道这是服务器给的身份标识,于是就保存起来,下次请求时会自动将此key=value值放入到Cookie字段中发给服务器。
  3. 服务器收到请求报文后,发现Cookie字段中有值,就能根据此值识别用户的身份然后提供个性化的服务。
    Django基础7——用户认证系统、Session管理、CSRF安全防护机制,python开发,django,csrf,安全,python,linux

Session的作用:

  • 试想一下,如果将用户账户的一些信息都存入Cookie中的话,一旦信息被拦截,那么所有的账户信息都会可能被泄露丢,这是不安全的。
  • 所以就出现了Session,在一次会话中将重要信息保存在Session中,浏览器只记录SessionId,一个SessionId对应一次会话请求。
    Django基础7——用户认证系统、Session管理、CSRF安全防护机制,python开发,django,csrf,安全,python,linux

3.1 Django使用Session

3.1.1 Cookie用法

  • 在settings.py配置文件中设置客户端Cookie。
参数 描述
SESSION_COOKIE_NAME = “sessionid” Session的cookie保存在浏览器上时的key
即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = “/” Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False 是否每次请求都保存Session,默认修改之后才保存(默认)

1.设置Cookie过期时间,单位s。

##ORM/settings.py文件末尾添加此行。
SESSION_COOKIE_AGE = 30*60

Django基础7——用户认证系统、Session管理、CSRF安全防护机制,python开发,django,csrf,安全,python,linux

2.设置关闭浏览器使得Session过期。

##ORM/settings.py文件末尾添加此行。
SESSION_EXPIRE_AT_BROWSER_CLOSE = True

Django基础7——用户认证系统、Session管理、CSRF安全防护机制,python开发,django,csrf,安全,python,linux

3.1.2 Session用法

  • 在视图中操作Session。
参数 描述
request.session[‘key’] = value 向Session写入键值
request.session.get(‘key’,None) 获取Session中键的值
request.session.flush() 清除Session数据
request.session.set_expiry(value) Session过期时间

1.自定义向Session写入键值,前端可以拿到该value值。
Django基础7——用户认证系统、Session管理、CSRF安全防护机制,python开发,django,csrf,安全,python,linux
Django基础7——用户认证系统、Session管理、CSRF安全防护机制,python开发,django,csrf,安全,python,linux

3.2 案例:用户登录认证

1.自己实现登陆验证功能。

############################################################################
##根据上文内容,将login接口试图修改成如下内容。
def login(request):
    if request.method == "GET":
        return render(request, 'login.html')
    elif request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username =="qingjun" and password == "citms@123":
            #登录成功,is_login设置为True
            request.session['is_login'] = True  
            request.session[ 'username'] = username   #保存用户名到数据库。
            return redirect("/")
        else:
            msg ="用户名或密码错误 !"
            return render(request,'login.html',{'msg': msg})

############################################################################
1、定义装饰器,可以给其他视图引用,新增文件ORM/main.py。
from django.shortcuts import render,HttpResponse,redirect
def self_login_required(func):
    def inner(request):
        is_login = request.session.get('is_login', False)
        if is_login:
            return func(request)
        else:
            return redirect("/login")
    return inner
############################################################################
2、引用装饰器。
from ORM.main import self_login_required
@self_login_required
def home(request):
    return render(request, 'index.html')

2.查看效果。
Django基础7——用户认证系统、Session管理、CSRF安全防护机制,python开发,django,csrf,安全,python,linux

四、Django CSRF安全防护机制

概念:

  • CSRF(Cross Site Request Forgery):跨站请求伪造,实现的原理是CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任,以用户身份在攻击页面对目标网站发起伪造用户操作的请求,达到攻击目的。

Django怎么验证一个请求是不是CSRF?

  • Django处理客户端请求时,会生成一个随机Token,放到Cookie里一起返回,然后需要前端每次POST请求时带上这个Token,可以放到POST数据里键为csrfmiddlewaretoken,或者放到请求头键为X-CSRFToken,Django从这两个位置取,每次处理都会拦截验证,通过比对两者是否一致来判断这个请求是不是非法,非法就返回403状态码。

可以携带CSRF Token发送给服务端的方法:

  1. from表单添加{% csrf_token %}标签,表单会携带一同提交。
  2. 如果你是Ajax请求,需要把csrf token字符串(也是通过拿{% csrf_token %}标签产生的值)放到data里一起提交,并且键名为csrfmiddlewaretoken或者放到请求头传递服务端。
  3. 指定取消某函数视图CSRF防护。

1.Django默认启用CSRF保护机制,当有post请求时,就会被拦截。
Django基础7——用户认证系统、Session管理、CSRF安全防护机制,python开发,django,csrf,安全,python,linux
2.此时可以给html模板中添加csrf标签,浏览器可以其值与表单一起提交给服务端。
Django基础7——用户认证系统、Session管理、CSRF安全防护机制,python开发,django,csrf,安全,python,linux
Django基础7——用户认证系统、Session管理、CSRF安全防护机制,python开发,django,csrf,安全,python,linux
3.还有其他两种方式。文章来源地址https://www.toymoban.com/news/detail-681257.html

##########################################################
方式2,不建议使用,建议在html模板中添加标签方式返回。
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def index(request):
return render(request, 'index.html')
##########################################################
var csrf_token = $("[name='csrfmiddlewaretoken']").val();
var data = {'id': '123', 'csrfmiddlewaretoken': csrf_token};
$.ajax({
	type: "POST",
	url: "/api",
	data: data,
	dataType: 'json'
})

到了这里,关于Django基础7——用户认证系统、Session管理、CSRF安全防护机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python 框架学习 Django篇 (五) Session与Token认证

    我们前面经过数据库的学习已经基本了解了怎么接受前端发过来的请求,并处理后返回数据实现了一个基本的登录登出效果,但是存在一个问题,我们是将所有的请求都直接处理了,并没有去检查是否为已经登录的管理员发送的,如果是这样的话客户端可以不选择登录直接去

    2024年02月07日
    浏览(41)
  • 【用户认证】密码加密,用户状态保存,cookie,session,token

    认证(authentication )是验证你的身份的过程,而授权(authorization)是验证你有权访问的过程 获取用户提交的用户名和密码 根据用户名,查询数据库,获得完整的用户信息,包括真正的密码 比较提交的密码和查询到的密码 如果二者相等,则用户认证成功;否则用户认证失败

    2024年02月12日
    浏览(47)
  • 【Django学习】(十六)session_token认证过程与区别_响应定制

    这里就直接引用别人的文章,不做过多说明 网络应用中session和token本质是一样的吗,有什么区别? - 知乎 在全局配置表中配置 rest_framework_jwt/views.py中 ​  查看ObtainJSONWebToken类: 发现里面引用了JSONWebTokenSerializer序列化器类 ​ users应用的url.py 引用obtain_jwt_token  发现rest_fra

    2024年02月15日
    浏览(39)
  • Django基础入门:后台管理 超级用户 数据表注册操作③

    🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主 🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读! 🎁🎁: 文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。 Django 的后台管理系统是非常出

    2024年02月11日
    浏览(60)
  • 万字讲解9种Web应用攻击与防护安全。XSS、CSRF、SQL注入等是如何实现的

    OWASP(开放Web软体安全项目- Open Web Application Security Project) 是一个开源的、非盈利的全球性安全组织,致力于应用软件的安全研究。使命 是使应用软件更加安全,使企业和组织能够对应用安全风险做出更清晰的决策。 http://www.owasp.org.cn/ OWASP在业界影响力: OWASP被视为web应用

    2023年04月15日
    浏览(54)
  • 【Django用户认证】通过阿里云如何实现实名认证

    我最近在我的项目上有实名认证的需求,主要实现人名和身份证号码的验证,针对这一块具体怎么做的文章比较少,我解决问题之后,觉得还是把这些坑都写清楚,方便初学者。 网络并非法外之地。然而,却存在部分网络用户利用虚拟的网络空间,实施网络暴力、造谣诽谤、

    2024年02月06日
    浏览(60)
  • Django用户认证: 利用Django Auth模块实现用户注册、登录与登出

    用户登录注册属于用户认证的一部分,Django内置了一套用户认证体系,使用起来比较方便,而且支持用户定制和拓展,足以满足任何复杂的业务需求。 Django框架中,用户权限管理被划分为三个层次: 用户 :系统使用者,拥有自己的权限。可被一个或多个用户组包含。 用户组

    2023年04月20日
    浏览(58)
  • django authenticate--用户身份认证

    authenticate Django的contrib.auth模块中的authenticate()函数用于对用户的凭据进行身份验证,与已配置的身份验证后端进行比较。 当用户尝试登录时,authenticate()函数将使用用户的凭据(即用户名和密码)作为参数进行调用,该函数然后检查可用的身份验证后端以验证凭据,这些后端在

    2024年02月05日
    浏览(58)
  • 最强的单点登录认证系统,基于RBAC统一权限控制,实现用户生命周期管理,开源、安全

    MaxKey 单点登录认证系统,谐音马克思的钥匙寓意是最大钥匙,是 业界领先的IAM-IDaas身份管理和认证产品 ,支持OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS、SCIM等标准协议,提供 安全、标准和开放 的用户身份管理(IDM)、身份认证(AM)、单点登录(SSO)、RBAC权限管理和资源管理等。 MaxKey注

    2024年02月03日
    浏览(56)
  • 3-1. SpringBoot项目集成【用户身份认证】实战 【技术选型篇】基于Session、Token、JWT怎么选?

    通过第二章2-2. SpringBoot API开发详解 --SpringMVC注解+封装结果+支持跨域+打包,我们实现了基于SpringBoot项目的 API接口开发 ,并实现 API结果统一封装、支持跨域请求 等等功能,接下来开始第三章,主要做用户身份认证,主要实现一套 统一鉴权的用户身份认证的机制 。 我已经提

    2024年01月22日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包