今日内容概要
- csrf跨站请求伪造
- csrf相关校验策略
- CBV添加装饰器的多种方式
- auth认证模块
今日内容详细
csrf跨站请求伪造
钓鱼网站:模仿一个正规的网站 让用户在该网站上做操作 但是操作的及诶过会影响到用户正常的网站账户 但是其中有一些猫腻
如:英语四六级考试需要网上先缴费 但是你会发现卡里的钱扣了 但是却交到了一个莫名其妙的账户 并不是真正的四六级官方账户
模拟钓鱼网站案例:转账案例
原理其实就是内部隐藏标签
csrf校验策略
在提交数据的位置添加唯一标识
1.form表单csrf策略
form表单内部添加{% csrf_token %}
2.ajax请求csrf策略
方式1:自己动手取值 较为繁琐
data: {'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()}
方式2:利用模板语法自动获取(一定要用引号引起来)
data:{'csrfmiddlewaretoken': '{{ csrf_token }}'}
方式3:直接引入一个js脚本即可(官网提供的)
参考:https://www.cnblogs.com/Dominic-Ji/p/9234099.html
csrf相关装饰器
整个django项目都校验csrf 但是某些视图函数/类不想要校验
整个django项目都不想校验csrf 但是某些视图函数/类需要校验
FBV添加装饰器的方式(与正常的函数添加装饰器一致)
# 导入装饰器
from django.views.decorators.csrf import csrf_exempt, csrf_protect
# @csrf_exempt # 局部禁用
@csrf_protect # 局部使用
def transfer_func(request):pass
CBV添加装饰器的方式(与正常情况不一样 需要注意)
主要有三种方式
# 导入装饰器
from django.utils.decorators import method_decorator
方式1:直接加在类上 但是必须得有name参数
@method_decorator(csrf_protect, name='post')
class MyView(views.View):
方式2: 加在dispatch方法上 整个类中生效
@method_decorator(csrf_protect)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
方式3:加在加在CBV视图的get或post方法上
@method_decorator(csrf_protect):
def post(self, request):
return HttpResponse('from cbv post view')
注意:有一个装饰器是特例 只有一种添加方式>>>:csrf_exempt
只有加在dispatch方法上才会生效
auth认证模块
前戏:django自带一个admin路由 但是需要我们提供管理员账号和密码
如果想要使用admin后台管理 需要先创建表 然后创建管理员账号
直接执行数据库迁移命令即可产生默认的auth_user表 该表就是admin后台管理默认的认证表
创建超级管理员
python38 manage.py createsuperuser
auth认证相关模块及操作
from django.contrib import auth
from django.contrib.auth.models import User
1.用户注册功能
User.objects.create_user(username=username, password=password)
2.判断用户名和密码是否正确
user_obj = auth.authenticate(request, username=username, password=password) # 当用户名与密码正确时 会返回一个对象
3.判断用户是否登录
request.user.is_authenticated
4.获取登录用户对象数据
request.user
5.校验用户是否登录装饰器
from django.contrib.auth.decorators import login_required
局部配置
@login_required(login_url='/login/')
全局配置
现在settings中配置一个LOGIN_URL = '自定义的登陆页面的路由'
@login_required
6.校验原密码是否正确
request.user.check_password(原密码)
7.修改密码
request.user.set_password(新密码)
request.user.save() # 一定要保存 否则不生效
8.退出登陆
auth.logout(request)
扩展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相关表还没有创建)
标签:11,框架,request,校验,auth,Django,user,csrf,django
From: https://www.cnblogs.com/lzjjjj/p/17019889.html