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

文章目录

  • 一、用户认证系统
  • 二、案例:登陆认证
    • 2.1 平台登入
    • 2.2 平台登出
    • 2.3 login_required装饰器
  • 三、Django Session管理
    • 3.1 Django使用Session
      • 3.1.1 Cookie用法
      • 3.1.2 Session用法
    • 3.2 案例:用户登录认证
  • 四、Django CSRF安全防护机制

一、用户认证系统

  • Django内置一个用户认证系统,使用auth模块实现。
  • auth模块提供了登录、注册、效验、修改密码、注销、验证用户是否登录等功能。
    在这里插入图片描述
  • 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权限。
在这里插入图片描述
3.测试效果。
在这里插入图片描述
在这里插入图片描述

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 Session管理

Session与Cookie是什么?

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

Cookie工作原理:

  1. 浏览器第一次访问服务器时,服务器此时肯定不知道它的身份,所以创建一个独特的身份标识数据,格式为key=value,放入到Set-Cookie字段里,随着响应报文发给浏览器。
  2. 浏览器看到有Set-Cookie字段以后就知道这是服务器给的身份标识,于是就保存起来,下次请求时会自动将此key=value值放入到Cookie字段中发给服务器。
  3. 服务器收到请求报文后,发现Cookie字段中有值,就能根据此值识别用户的身份然后提供个性化的服务。
    在这里插入图片描述

Session的作用:

  • 试想一下,如果将用户账户的一些信息都存入Cookie中的话,一旦信息被拦截,那么所有的账户信息都会可能被泄露丢,这是不安全的。
  • 所以就出现了Session,在一次会话中将重要信息保存在Session中,浏览器只记录SessionId,一个SessionId对应一次会话请求。
    在这里插入图片描述

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 = NoneSession的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600Session的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

在这里插入图片描述

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

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

在这里插入图片描述

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值。
在这里插入图片描述
在这里插入图片描述

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设置为Truerequest.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 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请求时,就会被拦截。
在这里插入图片描述
2.此时可以给html模板中添加csrf标签,浏览器可以其值与表单一起提交给服务端。
在这里插入图片描述
在这里插入图片描述
3.还有其他两种方式。

##########################################################
方式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'
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/58709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【100天精通python】Day47:python网络编程_Web编程基础

目录 1 网络编程与web编程 1.1 网络编程 1.2 web编程 2 Web开发概述 3 Web开发基础 3.1 HTTP协议 3.2 Web服务器 3.3 前端基础 3.4 静态服务器 3.5 前后端交互的基本原理 4 WSGI接口 4.1 CGI 简介 4.2 WSGI 简介 4.3 定义 WSGI 接口 4.4 运行 WSGI 服务 4.5…

视频汇聚/视频云存储/视频监控管理平台EasyCVR视频平台添加萤火云设备的具体操作步骤

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

Java项目-苍穹外卖-Day07-redis缓存应用-SpringCache/购物车功能

文章目录 前言缓存菜品问题分析和实现思路缓存菜品数据清理缓存数据功能测试 SpringCache介绍入门案例 缓存套餐购物车功能添加购物车需求分析和产品原型测试 前言 本章节主要是进行用户端的购物车功能开发 和redis作为mysql缓存的应用以及SpringCache的介绍 因为很多人查询数…

Linux学习之RAID

基础概念 RAID&#xff0c;英文全称为Redundant Arrays of Independent Drives&#xff0c;RAID&#xff0c;中文称为独立冗余磁盘阵列&#xff0c;这项技术把多个硬盘设备组合成一个容量更大的、安全性更好的磁盘阵列&#xff0c;把数据切割成许多区段分别放在不同的物理磁盘…

15. 实现业务功能--帖子操作

1. 集成编译器 editor.md 支持 MarkDown 语法编辑&#xff0c;在需要用户输⼊内容的页面按以下代码嵌入编辑器 1.1 编写 HTML <!-- 引⼊编辑器的CSS --> <link rel"stylesheet" href"./dist/editor.md/css/editormd.min.css"> <!-- 引⼊编…

Linux服务器中创建SVN项目详细步骤

一、Linux服务器中的SVN安装和搭建项目环境可以参考一下文章: 1、《阿里云服务器搭建》------搭建SVN服务 2、在一个服务器的svn上&#xff0c;设置一个端口号对应一个项目 3、如何解决Linuxsvn无法显示日志的问题 二、Linux服务器中的SVN项目如何添加项目的忽略文件&#xff1…

Rabbitmq的消息转换器

Spring会把你发送的消息序列化为字节发送给MQ&#xff0c;接收消息的时候&#xff0c;还会把字节反序列化为Java对象 ,只不过&#xff0c;默认情况下Spring采用的序列化方式是JDK序列化。众所周知&#xff0c;JDK序列化存在下列问题&#xff1a; 数据体积过大 有安全漏洞 可读…

TensorFlow-slim包进行图像数据集分类---具体流程

TensorFlow中slim包的具体用法 1、训练脚本文件&#xff08;该文件包含数据下载打包、模型训练&#xff0c;模型评估流程&#xff09;3、模型训练1、数据集相关模块&#xff1a;2、设置网络模型模块3、数据预处理模块4、定义损失loss5、定义优化器模块 本次使用的TensorFlow版本…

open cv快速入门系列---数字图像基础

目录 一、数字图像基础 1.1 数字图像和图像单位 1.2 区分图片分辨率与屏幕分辨率 1.3 图像的灰度与灰度级 1.4 图像的深度 1.5 二值图像、灰度图像与彩色图像 1.6 通道数 二、数字图像处理 2.1 图像噪声及其消除 2.2 数字图像处理技术 2.2.1 图像变换 2.2.2 图像增强…

爬虫逆向实战(二十七)--某某招标投标网站招标公告

一、数据接口分析 主页地址&#xff1a;某网站 1、抓包 通过抓包可以发现数据接口是page 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现&#xff0c;请求参数是一整个密文 请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 通…

springboot集成es 插入和查询的简单使用

第一步&#xff1a;引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>2.2.5.RELEASE</version></dependency>第二步&#xff1a;…

Tomcat安装及基本使用

1. 什么是Web服务器 Web服务器是一种应用程序&#xff08;软件&#xff09;&#xff0c;它封装了对HTTP协议的操作&#xff0c;使得开发人员无需直接操作协议&#xff0c;从而简化了Web开发。其主要功能是提供网上信息浏览服务。 Web服务器安装在服务器端&#xff0c;我们可以…

C++ 异常

一、异常概念 异常是一种处理错误的方式&#xff0c;当一个函数发现自己无法处理的错误时就可以抛出异常&#xff0c;让函数的直接或间接 的调用者处理这个错误。 throw: 当问题出现时&#xff0c;程序会抛出一个异常。这是通过使用 throw 关键字来完成的。 catch: 在您想要…

Hystrix: Dashboard流监控

接上两张服务熔断 开始搭建Dashboard流监控 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocat…

Git 简单介绍

Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。 一、Git 安装 windows安装&#xff1a;进入网站 https://git-scm.com/ 安装&#xff0c;ubuntu配置&#xff1a;apt install git。当前于 Win 下已安装 Git 版本 2.40.1。 二、配置 设…

一台服务器上部署 Redis 伪集群

哈喽大家好&#xff0c;我是咸鱼 今天这篇文章介绍如何在一台服务器&#xff08;以 CentOS 7.9 为例&#xff09;上通过 redis-trib.rb 工具搭建 Redis cluster &#xff08;三主三从&#xff09; redis-trib.rb 是一个基于 Ruby 编写的脚本&#xff0c;其功能涵盖了创建、管…

flutter高德地图大头针

1、效果图 2、pub get #地图定位 amap_flutter_map: ^3.0.0 amap_flutter_location: ^3.0.0 3、上代码 import dart:async; import dart:io;import package:amap_flutter_location/amap_flutter_location.dart; import package:amap_flutter_location/amap_location_option…

网络安全研究和创新:探讨网络安全领域的最新研究成果、趋势和创新技术,以及如何参与其中。

第一章&#xff1a;引言 随着数字化时代的到来&#xff0c;网络安全变得比以往任何时候都更加重要。无论是个人、企业还是国家&#xff0c;都面临着日益复杂和隐蔽的网络威胁。为了确保我们的信息和资产的安全&#xff0c;网络安全研究变得至关重要。本文将深入探讨网络安全领…

安防监控/磁盘阵列存储/视频汇聚平台EasyCVR调用rtsp地址返回的IP不正确是什么原因?

安防监控/云存储/磁盘阵列存储/视频汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RT…

LNMP架构之搭建Discuz论坛

LNMP 一、编译安装Nginx1&#xff09;前置准备2&#xff09;开始编译安装3&#xff09;添加到系统服务&#xff08;systemd启动&#xff09; 二、编译安装MySQL服务1&#xff09;前置准备2&#xff09;编译安装3&#xff09;编辑配置文件4&#xff09;更改mysql安装目录和配置文…