Django框架:13、csrf跨站请求伪造、auth认证模块及相关用法
Django框架
一、csrf跨站请求伪造
1、简介
csrf是django默认中间件中的一道,它用于验证网页的真伪性,通过在在前端页面设置csrf_token令牌,这样转递到后端的信息将会在csrf中间件中进行验证,虚假的网站中不会有csrf令牌的键值对,这样就虚假的网站所传递来的信息将会被csrf中间件所阻挡,无法通过django的中间件层

2、csrf校验策略
form表单csrf策略
通过在form表单内添加{% csrf_token %}
<body>
<form action="" method="post">
{% csrf_token %}
<p>用户名:
<input type="text" name="name" value="">
</p>
<p>密码:
<input type="password" name="pwd" value="">
</p>
<input type="submit" value="提交">
</form>
</body>

在form表单内部添加csrf令牌后,表单内部将会自动生成一个input标签,该标签内部会生成一个name属性和value属性,value属性的值在每次刷新页面时自动生成,当我们在再点击提交后该标签内的值会被传递到django的csrf中间件中进行验证,如果验证没有通过此次提交的所有数据都不会生效
ajax请求csrf策略
方式一:手动添加csrf键值对
<script>
$('#button').click(function () {
$.ajax({
url:'',
type:'post',
data: {'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()}
})
})
</script>
方式二:利用模板语法获取
<script>
$('#button').click(function () {
$.ajax({
url:'',
type:'post',
data:{'csrfmiddlewaretoken':'{{ csrf_token }}'}
})
})
</script>
方式三:导入官方JS脚本
参考:https://www.cnblogs.com/Dominic-Ji/p/9234099.html
3、csrf相关装饰器
在我们编写代码时,可能并不是所有的视图函数都需要校验csrf,例如:
1.整个django项目都校验csrf 但是某些个视图函数\类不想校验
2.整个django项目都不校验csrf 但是某些个视图函数\类需要校验
这时候可以通过以下几种方法来进行验证或取消验证
FBV添加装饰器方式
1、导入模块:
from django.views.decorators.csrf import csrf_exempt, csrf_protect
2、具体用法:
# 校验csrf (settings中csrf中间件没有打开的情况下也会校验)
@csrf_protect
def transfer_func(request):pass
# 不校验csrf
@csrf_exempt
def transfer_func(request):pass
CBV添加装饰器方式
1、导入模块:
from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.utils.decorators import method_decorator
from django.views import View
2、全局不校验的情况下将指定的类/功能函数校验:(三种方式)
# 方式一:指定类下某个功能函数进行校验
@method_decorator(csrf_protect, name='post')
class Login(views.View):
def post(selfs, request):
pass
# 方式二:直接将类中将需要校验的功能函数进行装饰
class Login(views.View):
@method_decorator(csrf_protect)
def post(selfs, request):
pass
# 方式三:该类中所有功能函数都校验csrf
class Login(views.View):
@method_decorator(csrf_protect)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def post(selfs, request):
pass
2、全局校验csrf的情况下指定类不校验:(一种方式)
class Login(views.View):
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def post(selfs, request):
pass
二、auth认证模块
1、简介
django自带一个admin路由 但是需要我们提供管理员账号和密码
如果想要使用admin后台管理 需要先创建表 然后创建管理员账号,直接执行数据库迁移命令即可产生默认的auth_user表,该表就是admin后台管理默认的认证表

创建超级管理员
1、创建超级管理员需要在pycharm的终端中输入指令:
python38 manage.py createsuperuser
2、auth认证相关模块及操作
auth 模块
1、导入模块
from django.contrib import auth
2、相关功能:
1.获取用户(判断用户名和密码)
user_obj = auth.authenticate(request,
username=username,
password=password)
# 需要传入三个固定参数,request对象、用户名、密码,返回用户对象
2.记录用户登陆状态(在前端保存cokie)
auth.login(request,user_obj)
User 模块
1、导入模块:
from django.contrib.auth.models import User
2、相关功能:
1.创建普通用户
User.objects.create_user(username=username, password=password)
2.获取登录用户对象数据(需要先用auth模块保存用户登陆状态,未登陆获取到的时匿名)
request.user
3.判断用户是否登录(需要先用auth模块保存用户登陆状态)
request.user.is_authenticated
4.校验原密码是否正确(需要先用auth模块保存用户登陆状态)
request.user.check_password(原密码)
5.修改密码(需要先用auth模块保存用户登陆状态)
request.user.set_password(新密码)
request.user.save()
6.退出登录(需要先用auth模块保存用户登陆状态)
auth.logout(request)
login_required 模块
1、导入模块:
from django.contrib.auth.decorators import login_required
2、相关功能: # 用于校验用户是否登录,未登录可以控制跳转页面
1.@login_required(login_url='/login/') 局部配置
2.@login_required 全局配置
配置文件中LOGIN_URL = '/login/'
3、拓展auth_user表
还想使用auth模块的功能 并且又想扩展auth_user表的字段
思路1:一对一字段关联
思路2:替换auth_user表
步骤1:模型层编写模型类继承AbstractUser
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
# 填写AbstractUser表中没有的字段
phone = models.BigIntegerField()
desc = models.TextField()
步骤2:一定要在配置文件中声明替换关系
AUTH_USER_MODEL = 'app01.UserInfo'
ps:替换还有一个前提 就是数据库迁移没有执行过(auth相关表没有创建)
Django框架:13、csrf跨站请求伪造、auth认证模块及相关用法的更多相关文章
- django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块
CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...
- 第三百一十五节,Django框架,CSRF跨站请求伪造
第三百一十五节,Django框架,CSRF跨站请求伪造 全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...
- 十三 Django框架,CSRF跨站请求伪造
全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMidd ...
- Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)
Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造) 摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...
- Django中的CSRF(跨站请求伪造)
Django中的CSRF(跨站请求伪造) Django CSRF 什么是CSFR 即跨站请求伪装,就是通常所说的钓鱼网站. 钓鱼网站的页面和正经网站的页面对浏览器来说有什么区别? (页面是怎么来的? ...
- Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)
摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...
- django 中间键 csrf 跨站请求伪造
django中间件和auth模块 Django中间件 由django的生命周期图我们可以看出,django的中间件就类似于django的保安,请求一个相应时要先通过中间件才能到达django后端( ...
- Django框架 之 基于Ajax中csrf跨站请求伪造
Django框架 之 基于Ajax中csrf跨站请求伪造 ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({ data: {csrfmiddlewaretoken: ...
- Django框架(十二)-- 中间件、CSRF跨站请求伪造
中间件 一.什么是中间件 请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models) 响应的时候也需要经过中间件才能到达web服务网关接口 djang ...
- Django框架(十六)-- 中间件、CSRF跨站请求伪造
一.什么是中间件 中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出 二.中间件的作用 如果你想修改请求,例如被传送到view ...
随机推荐
- NOIP 2013 洛谷P1966 火柴排队 (树状数组求逆序对)
对于a[],b[]两个数组,我们应选取其中一个为基准,再运用树状数组求逆序对的方法就行了. 大佬博客:https://www.cnblogs.com/luckyblock/p/11482130.htm ...
- API接口笔记
1.基类 定义返回信息 protected $user; //用户表 protected $token; //用户token protected $isSuccess = FALSE; //状态是 ...
- 二、redis介绍
二.redis介绍 2.1.定义 Redis(Remote Dictionary Server ,远程字典服务) 是一个使用ANSI C编写的开源.支持网络.基于内存.可选持久性的键值对存储数据库,是 ...
- SpringBoot简单快速入门操作
项目类分为: dao层 server层 controller层 Mapper → Server→ controller mapper层(必须要用interface创建) 创建后,首先要在方法前加@Ma ...
- 如何免安装使用 Python?推荐 17 个在线的 Python 解释器!
作者:Al Sweigart 译者:豌豆花下猫@Python猫 英文:https://inventwithpython.com/blog/2022/10/30/17-online-python-ide ...
- Sql Server性能排查和优化懒人攻略
转载自作者zhang502219048的微信公众号[SQL数据库编程]:Sql Server性能排查和优化懒人攻略 很多年前,笔者那时刚从广东技术师范学院(现为广东技术师范大学,以前为广东民族学院)的 ...
- Terminal(oh-my-zsh) 美化
如果你使用Mac进行开发,那么Terminal.app应该是你使用非常频繁的app了.初体验Terminal时你可能觉得单调乏味,阅读密密麻麻的内容也很费劲.但是如果你跟着我一起配置它,就会发现你平时 ...
- C#串口初始化
//通信端口 string[] PortList = SerialPort.GetPortNames(); if (PortList.Length > 0) { this.cmb_Port.Da ...
- day02-实现01
实现01 1.实现任务阶段1 编写mytomcat,该服务器能给浏览器返回"你好,我是服务器!"的简单信息. 根据之前的tomcat框架整体分析,我们将浏览器发送请求,tomcat ...
- K8S kubesphere安装mysql
原先我们使用Docker按照mysql时候的命令 docker run -p 3306:3306 --name mysql-01 \ -v /mydata/mysql/log:/var/log/mys ...