• Django之csrf与auth模块操作


    csrf简介与策略

            为了避免钓鱼网站的漏洞,csrf要求发送请求的时候服务端响应时会分配一个随机字符串给客户端,当客户端第二次发送请求的时候携带上一次分配到的随机字符串到服务端进行校验

    1.CSRF中间件

            django中间件作用于整个项目,CSRF校验就是django中间件的其中之一对全局的所以视图函数或视图类起作用如果将其注释的话则就是所有的都不校验

    2.form表单请求

            form请求的CSRF校验只需加一个模版语法即可通过校验,也是最简单的一种使用方法语法格式如下:

    1. <form action="" method"post">
    2. {% csrf_token %}
    3. form>

    3.Ajax请求

            Ajax请求也需要用CSRF来校验,方式有多种

    方式一:

    1. {% csrf_token %}
    2. <button id="d1">Ajax请求button>
    3. <script>
    4. $('#d1').click(function () {
    5. $.ajax({
    6. url:'',
    7. type:'post',
    8. // 先编写csrf模版语法 在利用标签查找和值获取
    9. data:{'username':'haha','csrfmiddlewaretoken':$('[name="csrfmifflewaretoken"]').val()},
    10. success:function (args){
    11. }
    12. }
    13. }

    方式二:

    1. <button id="d1">Ajax请求button>
    2. <script>
    3. $('#d1').click(function () {
    4. $.ajax({
    5. url:'',
    6. type:'post',
    7. // 直接利用模版语法即可 引号不能省
    8. data:{'username':'haha','csrfmiddlewaretoken':'{{csrf_token }}'},
    9. success:function (args){
    10. }
    11. }
    12. }

    方式三:

            方式三是一种通用的方法需要编写js,先创建静态文件夹(在django配置文件中配置一下静态文件路径)再创建js文件,js代码无需我们自己编写官方就已经提供了

    1. <script scr="/static/csrf.js">script>
    1. function getCookie(name) {
    2. var cookieValue = null;
    3. if (document.cookie && document.cookie !== '') {
    4. var cookies = document.cookie.split(';');
    5. for (var i = 0; i < cookies.length; i++) {
    6. var cookie = jQuery.trim(cookies[i]);
    7. // Does this cookie string begin with the name we want?
    8. if (cookie.substring(0, name.length + 1) === (name + '=')) {
    9. cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
    10. break;
    11. }
    12. }
    13. }
    14. return cookieValue;
    15. }
    16. var csrftoken = getCookie('csrftoken');
    17. function csrfSafeMethod(method) {
    18. // these HTTP methods do not require CSRF protection
    19. return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    20. }
    21. $.ajaxSetup({
    22. beforeSend: function (xhr, settings) {
    23. if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
    24. xhr.setRequestHeader("X-CSRFToken", csrftoken);
    25. }
    26. }
    27. });

    CBV添加装饰器方法

            有时候我们需要针对性的对几个请求需要校验几个不需要,如果靠通过注释中间件的话会导致其所有的统一不校验或者统一全部校验,在FBV与CBV中具体的方式有所不同

    1.针对FBV中的校验

    \bullet  csrf_protect:校验csrf

    \bullet  csrf_exempt:不校验csrf

    1. # 第一步需要先导包
    2. from django.view.decorators.csrf import ccsrf_protect,csrf_exempt
    3. # 用法很简单针对是否需要校验在函数上面加上装饰器即可
    4. # 如果注释了CSRF中间件又想校验下面函数需要加装饰器
    5. @csrf_protect
    6. def login(request):
    7. return HttpResponse('登陆')
    8. # 如果没有注释CSRF中间件又不想校验下面函数需要加装饰器
    9. @csrf_exempt
    10. def login(request):
    11. return HttpResponse('登陆')

    2.针对CBV中的校验

            针对CBV我们不能直接在类上面直接加装饰器 需要借助专门给CBV添加装饰器的方法同时也有好几种不同的方法:

    方式一:

            通过给CBV添加装饰器的方法直接在方法上指名道姓的添加,这种方式只能用于添加csrf_protect对csrf_exempt无效

    1. class MyHome(views.View):
    2. def get(self,request):
    3. return HttpResponse('Get')
    4. @method_decorator(csrf_protect) # 校验post方法
    5. def post(self,request):
    6. return HttpResponse('Post')

    方式二:

            在定义类上面提前添加好那些方法需要校验,这个方式同样也不能用来添加csrf_exempt

    1. @method_decorator(csrf_protect,name='post') # 提前指定
    2. class MyHome(views.View):
    3. def get(self,request):
    4. return HttpResponse('Get')
    5. def post(self,request):
    6. return HttpResponse('Post')

    方式三:

            直接影响类中所有的方法同时支持csrf_protect与csrf_exempt

    1. class MyHome(views.View):
    2. # @method_decorator(csrf_protect)
    3. @method_decorator(csrf_exempt)
    4. def dispatch(self,request,*args,**kwargs):
    5. super(MyHome,self).dispatch(request,*args,**kwargs)
    6. def get(self,request):
    7. return HttpResponse('Get')
    8. def post(self,request):
    9. return HttpResponse('Post')

    ps:针对csrf_exempt只有方式3有效,针对其他装饰器上述三种方式都有效

    auth模块简介

            auth模块是强大的django自带的一个用户认证模块,我们在开发网站的时候不可避免的需要用到用户的登录、注册等功能有了auth模块可以给我们带来更快的编写功能,django在执行数据库迁移命令后会产生一个auth_user表配合auth模块做用户认证,该表还是django admin后台管理默认的表

    1. # admin后台管理员账号创建
    2. python manage.py createsuperuser

    auth模块常见功能:

    1. # 1.创建用户
    2. from django.contrib.auth.models import User
    3. User.object.create_user(username,password)
    4. # 注意创建管理员一定要加上邮箱
    5. User.object.create.superuser(username,password,email)
    1. from django.contrib import auth # 导入模块
    2. # 校验用户名和密码是否正确
    3. auth.authenticate(request,username,password)
    4. # 用户登录
    5. auth.login(request,user_obj)
    6. # 判断用户是否登录
    7. request.user.is_authecticated
    8. # 获取登录用户对象
    9. rquest.user
    10. # 校验密码是否正确
    11. request.user.check_password(old_password)
    12. # 修改密码
    13. request.user.set_password(new_password)
    14. # 修改完记得保存
    15. request.user.save()
    16. # 注销登录
    17. auth.logout(request)

    auth给我们提供了装饰器工具,用来快捷的给某个视图添加登录校验,如果用户没有登录则会跳转到django默认的URL '/accounts/login/ ',如果需要自定义登录的URL则需要在配置文件settings.py中通过LOGIN_URL进行修改

    1. from django.contrib.auth.decorators import login_required
    2. @login_required
    3. def My_view(request):
    4. pass
    5. # 跳转局部配置
    6. login_request(login_url='/login/'
    7. # 跳转全局配置
    8. LOGIN_URL = '/login/'

    auth_user表切换

    1. # 1.models.py
    2. from django.contrib.auth.models import AbstractUser
    3. class Userinfo(AbstractUser):
    4. '''扩展auth_user表中没有的字段'''
    5. phone = models.BigIntegerField()
    6. desc = models.TextField()
    7. # 2.settings.py
    8. AUTH_USER_MODEL = 'app01.Userinfo'
  • 相关阅读:
    maven简单总结
    Kafka (四) --------- 生产经验
    机器人过程自动化(RPA)入门 2. 录制播放
    使用极狐GitLab的VS Code插件 GitLab Workflow 来进行项目的DevOps管理,助力研发效能
    汽车电子时钟硬件设计指南
    多臂老虎机
    解决flex-direction: column 之后元素宽度自动变为100%
    【Dotnet 工具箱】WPF UI - 现代化设计的开源 WPF 框架
    使用ES检索PDF或Word等格式文件方案
    在Kubernetes上安装和配置Istio:逐步指南,展示如何在Kubernetes集群中安装和配置Istio服务网格
  • 原文地址:https://blog.csdn.net/weixin_52596593/article/details/126841517