Django框架

一、csrf跨站请求伪造

1、简介

​ csrf是django默认中间件中的一道,它用于验证网页的真伪性,通过在在前端页面设置csrf_token令牌,这样转递到后端的信息将会在csrf中间件中进行验证,虚假的网站中不会有csrf令牌的键值对,这样就虚假的网站所传递来的信息将会被csrf中间件所阻挡,无法通过django的中间件层

Django框架:13、csrf跨站请求伪造、auth认证模块及相关用法

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>

Django框架:13、csrf跨站请求伪造、auth认证模块及相关用法
在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后台管理默认的认证表

Django框架:13、csrf跨站请求伪造、auth认证模块及相关用法

创建超级管理员

1、创建超级管理员需要在pycharm的终端中输入指令:
    python38 manage.py createsuperuser

image-20230102154454470

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相关表没有创建)