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工作原理:
- 浏览器第一次访问服务器时,服务器此时肯定不知道它的身份,所以创建一个独特的身份标识数据,格式为key=value,放入到Set-Cookie字段里,随着响应报文发给浏览器。
- 浏览器看到有Set-Cookie字段以后就知道这是服务器给的身份标识,于是就保存起来,下次请求时会自动将此key=value值放入到Cookie字段中发给服务器。
- 服务器收到请求报文后,发现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 = 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
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发送给服务端的方法:
- from表单添加{% csrf_token %}标签,表单会携带一同提交。
- 如果你是Ajax请求,需要把csrf token字符串(也是通过拿{% csrf_token %}标签产生的值)放到data里一起提交,并且键名为csrfmiddlewaretoken或者放到请求头传递服务端。
- 指定取消某函数视图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'
})
相关文章:

Django基础7——用户认证系统、Session管理、CSRF安全防护机制
文章目录 一、用户认证系统二、案例:登陆认证2.1 平台登入2.2 平台登出2.3 login_required装饰器 三、Django Session管理3.1 Django使用Session3.1.1 Cookie用法3.1.2 Session用法 3.2 案例:用户登录认证 四、Django CSRF安全防护机制 一、用户认证系统…...

基于流计算 Oceanus(Flink) CDC 做好数据集成场景
由于第一次做实时,所以踩坑比较多,见谅(测试环境用的flink),小公司没有用到hadoop组件 一、踩坑记录 1:本地代码的flink版本是flink1.15.4,生产环境是flink1.16.1,在使用侧输出流时报错,需要使用以下写法,需要使用Si…...

MySQL8.Xx安装控制台未生成随机密码解决方案
MySQL8.xx一主两从复制安装与配置 MySQL8.XX随未生成随机密码解决方案 MySQL8.0.30一主两从复制与配置(一) 一: Mysql 安装时控制台未生成密码 安装过程中解压或者安装时报错等,这种情况一般是因网络等其他原因导致下载的安装包不完整, 重新下载安装即可; 二:…...

安装VS2005时提示:请插入磁盘:visual studio 2005 DVD
安装VS2005时提示:请插入磁盘:visual studio 2005 DVD 修改卷标为 "DVD1"...

OpenVINO2023使用简介
1 下载安装 先在anaconda中创建一个虚拟环境,该环境的python版本为3.7,之所以使用python3.7,是因为我在3.9上安装过程中出现不少bug,后面新建了一个3.7的环境才解决,我不知道是否由于和我已有环境中某些包不兼容&…...

基于React实现无限滚动的日历详细教程,附源码【手写日历教程第二篇】
前言 最常见的日历大部分都是滚动去加载更多的月份,而不是让用户手动点击按钮切换日历月份。滚动加载的交互方式对于用户而言是更加丝滑和舒适的,没有明显的操作割裂感。 那么现在需要做一个这样的无限滚动的日历,前端开发者应该如何去思考…...

68、使用aws官方的demo和配置aws服务,进行视频流上传播放
基本思想:参考官方视频,进行了配置aws,测试了视频推流,rtsp和mp4格式的视频貌似有问题,待调研和解决 第一步:1) 进入aws的网站,然后进入ioT Core 2)先配置 Thing types & Thing,选择香港的节点,然后AWS ioT--->Manage---> Thing type 然后输入名字,创建Th…...

数据库
表 记录:行 字段(属性): 列 以行列的形式就组成了表(数据存储在表中) 关系数据库的表由记录组成,记录由字段组成,字段由字符或数字组成。它可以供各种用户共享, 具有最小冗余度和较高…...

深入了解fcntl函数:Linux系统编程中的文件控制
文章目录 概述介绍函数原型与参数 拓展:fcntl改文件属性总结 概述 摘要: fcntl函数是Linux系统编程中一个重要的函数,用于对文件描述符进行各种控制操作。本文将详细介绍fcntl函数的原型、各个参数的用法,以及阻塞和非阻塞模式切换的方法&am…...

汇川技术内推码
[庆祝]不一样的内推码[庆祝]:IVSM2R 投递了可以评论下名字,我会帮忙留意进度。 汇尔成川,共赴星海,欢迎加入,职等你来。 嵌入式软硬件,机器人算法,电机控制,通信软件,PLC…...

nacos服务器启动报错集合
报错1 Error creating bean with name ‘user‘: Unsatisfied dependency expressed through field ‘jwtTokenManage 开启鉴权之后,你可以自定义用于生成JWT令牌的密钥,application.properties中的配置信息为: ### Since 1.4.1, worked when…...

C语言_分支和循环语句(2)
文章目录 前言一、for 循环1.1语法1.2 for 语句的循环控制变量1.3 一些 for 循环的变种 二、do ... while()循环2.1 do 语句的语法2.2 do ... while 循环中的 break 和 continue2.3 练习1 **- 计算n的阶乘**2. - **在一个有序数组中查找具体的某个数字 n** 二分查找算法&#x…...

JMeter 接口自动化测试:从入门到精通的完全指南
JMeter 是一个开源的负载测试工具,它可以模拟多种协议和应用程序的负载,包括 HTTP、FTP、SMTP、JMS、SOAP 和 JDBC 等。在进行接口自动化测试时,使用 JMeter 可以帮助我们快速地构建测试用例,模拟多种场景,发现接口的性…...

【Java】集合List的toArray()方法及其重载
在Java中,集合(List 接口的实现类)提供了一个名为 toArray 的方法,用于将集合中的元素转换成数组。该方法有两个主要的重载形式,分别用于不同的情况。 toArray()重载方法1 <T> T[] toArray(T[] a)这个方法将集…...

Python学习笔记:Requests库安装、通过url下载文件
1.下载安装requests库 在pipy或者github下载,通常是个zip,解压缩后在路径输入cmd,并运行以下代码 Python setup.py install 安装完成后,输入python再输入import requests得到可以判断时候完成安装 2.通过url下载文件 使用的是u…...

git pull --rebase 用法
git pull --rebase git pull --rebase 是 Git 命令中的一个选项,它的作用是在从远程仓库拉取更新时使用 rebase 而不是默认的合并方式。使用这个命令会使您的提交历史更加整洁,因为它将您的本地提交在远程更新之前重新应用到新的提交之上。 这个命令的…...

react antd框架中的徽标获取数据对应状态的数量
实现思路:获取数量的思路是通过filter过滤符合数据来实现。 列表数组.filter(item > item.status 值).length; 例子:以下这个例子是判断data数组中的status中在职的数量。 data.filter((item) > item.status 在职).length 效果展示ÿ…...

【多线程】Thread类的用法
文章目录 1. Thread类的创建1.1 自己创建类继承Thread类1.2 实现Runnable接口1.3 使用匿名内部类创建Thread子类对象1.4 使用匿名内部类创建Runnable子类对象1.5 使用lambda创建 2. Thread常见的构造方法2.1 Thread()2.2 Thread(Runnable target)2.3 Thread(String name)2.4 Th…...

第八章 贪心算法 part03 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果 (day34补)
本文章代码以c为例! 一、力扣第1005题:K 次取反后最大化的数组和 题目: 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组: 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择…...

Android Activity启动过程一:从Intent到Activity创建
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、概览二、应用内启动源码流程 (startActivity)2.1 startActivit…...

第9章:聚类
聚类任务 性能度量 距离度量 非度量距离 原型聚类 有很好的统计学上的意义,但是只能找到椭球形的聚类。 密度聚类 层次聚类...

程序员为什么要写bug,不能一次性写好吗?
仅仅听到“Bug”这个词就会让你作为一个开发人员感到畏缩。我们相信,优秀的程序员是那些编写无错误代码的人。随着一些开发人员强调要成为一名零错误程序员,我们进行了更深刻的思考,并发现事实的准确性。 所有制作的软件都应该没有错误。对此…...

Nginx反向代理其他服务
Nginx反向代理 嘿,你的网络遇到了限制,不能直接通过服务的端口进行访问?别担心,我们可以借助Nginx这个超级英雄来解决这个问题!让我给你讲讲关于Nginx反向代理的故事吧。 首先,让我们明确一下反向代理的概…...

MQ 简介-RabbitMQ
一. MQ 简介 消息队列作为高并发系统的核心组件之一,能够帮助业务系统结构提升开发效率和系统 稳定性,消息队列主要具有以下特点: 削峰填谷:主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题系统解耦:解决不同重要程度、不…...

强化学习(2)
强化学习(1) 1.多智能体深度强化学习重要性采样 多智能体深度强化学习(Multi-Agent Deep Reinforcement Learning,MADRL)是指在多智能体环境下使用深度强化学习算法进行协同学习。重要性采样(Importance Sampling)是…...

Visual Studio 2022的MFC框架——theApp全局对象
我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Visual Studio 2022下开发工具的MFC框架知识。 MFC中的WinMain函数是如何与MFC程序中的各个类组织在一起的呢?MFC程序中的类是如何与WinMain函数关联起来的呢?…...

SpringBoot Cache
一、基本概念 Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。 Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如: • EHCache • Caffeine …...

vue 简单实验 自定义组件 component
1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"components-demo"><button-counter></button-counter> </div> <script> // 创建一个Vue 应用 const ap…...

C++ 改善程序的具体做法 学习笔记
1、尽量用const enum inline替换#define 因为#define是做预处理操作,编译器从未看见该常量,编译器刚开始编译,它就被预处理器移走了,而#define的本质就是做替换,它可能从来未进入记号表 解决方法是用常量替换宏 语言…...

Unity 之 GameObject.Find()在场景中查找指定名称的游戏对象
文章目录 GameObject.Find 是 Unity 中的一个函数,用于在场景中查找指定名称的游戏对象。这个函数的主要作用是根据游戏对象的名称来查找并返回一个引用,使您能够在代码中操作该对象。以下是有关 GameObject.Find 的详细介绍: 函数签名&…...