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认证模块及相关用法的更多相关文章

  1. django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块

    CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...

  2. 第三百一十五节,Django框架,CSRF跨站请求伪造

    第三百一十五节,Django框架,CSRF跨站请求伪造  全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...

  3. 十三 Django框架,CSRF跨站请求伪造

     全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMidd ...

  4. Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)

    Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造)   摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...

  5. Django中的CSRF(跨站请求伪造)

    Django中的CSRF(跨站请求伪造) Django CSRF  什么是CSFR 即跨站请求伪装,就是通常所说的钓鱼网站. 钓鱼网站的页面和正经网站的页面对浏览器来说有什么区别? (页面是怎么来的? ...

  6. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)

    摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...

  7. django 中间键 csrf 跨站请求伪造

    django中间件和auth模块   Django中间件 由django的生命周期图我们可以看出,django的中间件就类似于django的保安,请求一个相应时要先通过中间件才能到达django后端( ...

  8. Django框架 之 基于Ajax中csrf跨站请求伪造

    Django框架 之 基于Ajax中csrf跨站请求伪造 ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({     data: {csrfmiddlewaretoken: ...

  9. Django框架(十二)-- 中间件、CSRF跨站请求伪造

    中间件 一.什么是中间件 请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models) 响应的时候也需要经过中间件才能到达web服务网关接口 djang ...

  10. Django框架(十六)-- 中间件、CSRF跨站请求伪造

    一.什么是中间件 中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出 二.中间件的作用 如果你想修改请求,例如被传送到view ...

随机推荐

  1. NOIP 2013 洛谷P1966 火柴排队 (树状数组求逆序对)

    对于a[],b[]两个数组,我们应选取其中一个为基准,再运用树状数组求逆序对的方法就行了. 大佬博客:https://www.cnblogs.com/luckyblock/p/11482130.htm ...

  2. API接口笔记

    1.基类   定义返回信息 protected $user; //用户表 protected $token; //用户token protected $isSuccess = FALSE; //状态是 ...

  3. 二、redis介绍

    二.redis介绍 2.1.定义 Redis(Remote Dictionary Server ,远程字典服务) 是一个使用ANSI C编写的开源.支持网络.基于内存.可选持久性的键值对存储数据库,是 ...

  4. SpringBoot简单快速入门操作

    项目类分为: dao层 server层 controller层 Mapper → Server→ controller mapper层(必须要用interface创建) 创建后,首先要在方法前加@Ma ...

  5. 如何免安装使用 Python?推荐 17 个在线的 Python 解释器!

    作者:Al Sweigart 译者:豌豆花下猫@Python猫 英文:https://inventwithpython.com/blog/2022/10/30/17-online-python-ide ...

  6. Sql Server性能排查和优化懒人攻略

    转载自作者zhang502219048的微信公众号[SQL数据库编程]:Sql Server性能排查和优化懒人攻略 很多年前,笔者那时刚从广东技术师范学院(现为广东技术师范大学,以前为广东民族学院)的 ...

  7. Terminal(oh-my-zsh) 美化

    如果你使用Mac进行开发,那么Terminal.app应该是你使用非常频繁的app了.初体验Terminal时你可能觉得单调乏味,阅读密密麻麻的内容也很费劲.但是如果你跟着我一起配置它,就会发现你平时 ...

  8. C#串口初始化

    //通信端口 string[] PortList = SerialPort.GetPortNames(); if (PortList.Length > 0) { this.cmb_Port.Da ...

  9. day02-实现01

    实现01 1.实现任务阶段1 编写mytomcat,该服务器能给浏览器返回"你好,我是服务器!"的简单信息. 根据之前的tomcat框架整体分析,我们将浏览器发送请求,tomcat ...

  10. K8S kubesphere安装mysql

    原先我们使用Docker按照mysql时候的命令 docker run -p 3306:3306 --name mysql-01 \ -v /mydata/mysql/log:/var/log/mys ...