【Spring Security】 快速入门

文章目录

  • 一、 身份认证Demo
    • 1、创建工程
    • 2、代码编写
      • 2.1、Controller
      • 2.2、Html
      • 2.3、application.properties配置
    • 3、启动项目并访问
  • 二、Spring Security 默认做了什么
  • 二、底层原理
    • 1.概述
    • 2.Filters
      • DelegatingFilterProxy
      • FilterChainProxy
      • SecurityFilterChain
      • Security Filters
  • 三、程序的启动和运行
    • DefaultSecurityFilterChain
    • SecurityProperties
  • 总结


一、 身份认证Demo

1、创建工程

下载完成后,使用idea打开即可。
创建工程

2、代码编写

2.1、Controller

package com.security.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class IndexController {@GetMapping("/")public String index(){return "index";}
}

2.2、Html

<!DOCTYPE html>
<html xmlns:th="https://www.thymeleaf.org" lang="en">
<head><meta charset="UTF-8"><title>hello Security</title>
</head>
<body><h1>Hello Security</h1><a th:href="@{/logout}">Log Out</a>
</body>
</html>

2.3、application.properties配置

spring.application.name=security-demo
server.servlet.context-path=/demo
spring.security.user.name=admin
spring.security.user.password=123

3、启动项目并访问

在这里插入图片描述

二、Spring Security 默认做了什么

  • 保护应用程序URL,要求对应用程序的任何交互进行身份验证。
  • 程序启动时生成一个默认用户“user"。
  • 生成一个默认的随机密码,并将此密码记录在控制台上。
  • 生成默认的登录表单和注销页面。
  • 提供基于表单的登录和注销流程。
  • 对于Web请求,重定向到登录页面;
  • 对于服务请求,返回401未经授权。
  • 处理跨站请求伪造(CSRF)攻击。
  • 处理会话劫持攻击。
  • 写入Strict-Transport-Security以确保HTTPS。
  • 写入X-Content-Type-Options以处理嗅探攻击。
  • 写入Cache Control头来保护经过身份验证的资源。
  • 写入X-Frame-Options以处理点击劫持攻击。

二、底层原理

1.概述

Spring Security 之所以默认帮助我们做了那么多事情,它的底层原理是传统的Servlet过滤器。

2.Filters

在这里插入图片描述

DelegatingFilterProxy

Servlet 容器允许Filter使用自己的标准注册实例,但它不知道Spring定义的Bean。而DelegatingFilterProxy可以获取注册为Spring Bean的Filter。DelegatingFilterProxy通过标准 Servlet 容器机制进行注册,但将所有工作委托给实现Filter.
DelegatingFilterProxy伪代码

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {//延迟获取注册为Spring Bean的Filter,				Filter delegate = getFilterBean(someBeanName);//将工作委托给Spring Beandelegate.doFilter(request, response);
}

FilterChainProxy

Spring Security 的 Servlet 支持包含在FilterChainProxy。FilterChainProxy是 Spring Security 提供的特殊功能Filter,允许Filter通过委托给SecurityFilterChain许多实例。
由于FilterChainProxy是一个 Bean,因此它通常包装在DelegatingFilterProxy中。

SecurityFilterChain

FilterChainProxy使用SecurityFilterChain来确定应该为当前请求调用哪个Spring -SecurityFilter实例。

SecurityFilterChain中的安全过滤器通常是bean,但它们是在FilterChainProxy而不是DelegatingFilterProxy中注册的。FilterChainProxy为直接注册Servlet容器或DelegatingFilterProxy提供了许多优点。
首先,它为Spring Security的所有Servlet支持提供了一个起点。因此,如果您试图对Spring Security的Servlet支持进行故障排除,那么在FilterChainProxy中添加一个调试点是一个很好的开始。
其次,由于FilterChainProxy是Spring Security使用的核心,它可以执行非可选的任务。例如,它清除SecurityContext以避免内存泄漏。
它还应用Spring Security的HttpFirewall来保护应用程序免受某些类型的攻击。
此外,它在确定何时调用SecurityFilterChain方面提供了更大的灵活性。
在Servlet容器中,仅根据URL调用Filter实例。然而,FilterChainProxy可以通过使用RequestMatcher接口,基于HttpServletRequest中的任何内容来确定调用。

在Multiple SecurityFilterChain图中,FilterChainProxy决定应该使用哪个SecurityFilterChain。
只调用第一个匹配的SecurityFilterChain。
如果请求/api/messages/的URL,它首先匹配/api/**的SecurityFilterChaing模式,因此只有SecurityFilterChaing被调用,即使它也匹配
如果请求/messages/的URL,它与/api/**的SecurityFilterChain模式不匹配,因此FilterChainProxy继续尝试每个SecurityFilterChain。
假设没有其他SecurityFilterChain实例匹配,则调用SecurityFilterChain。
注意,SecurityFilterChaing只配置了三个安全过滤器实例。
然而,SecurityFilterChain配置了四个安全过滤器实例。
需要注意的是,每个SecurityFilterChain都可以是唯一的,并且可以单独配置。
事实上,如果应用程序希望Spring security忽略某些请求,SecurityFilterChain可能没有安全过滤器实例。

Security Filters

使用SecurityFilterChain api将安全过滤器插入到FilterChainProxy中。
这些过滤器可用于许多不同的目的,如身份验证、授权、漏洞利用保护等。
过滤器按照特定的顺序执行,以确保在正确的时间调用它们,例如,应该在执行授权的过滤器之前调用执行身份验证的过滤器。
通常不需要知道Spring Security过滤器的顺序。然而,有时知道顺序是有益的,如果你想知道它们,你可以检查FilterOrderRegistration代码。

三、程序的启动和运行

DefaultSecurityFilterChain

SecurityFilterChain接口的实现,加载了默认的16个Filter。
在这里插入图片描述

SecurityProperties

初始化用户名密码

spring.security.user.name=admin
spring.security.user.password=123

总结

  1. DelegatingFilterProxy作为过滤器的代理,帮助我们调用spring容器中所有注册的过滤器
  2. FilterChainProxy帮助我们管理多个不同的过滤器链(SecurityFilterChain)。
  3. SecurityFilterChain帮助我们处理复杂的业务逻辑,通过匹配不同的url,由不同的过滤器链的组合来接收,从而由不同的过滤器来完成相应的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/781096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java学习指南:从基础到进阶,一篇文章带你全面了解!

一、Java语言概述 Java是一种面向对象的编程语言&#xff0c;它不仅吸收了C语言的各种优点&#xff0c;还摒弃了C里难以理解的多继承、指针等概念。Java语言具有功能强大和简单易用两个特征&#xff0c;即Java语言作为静态面向对象编程语言的代表&#xff0c;极好地实现了面向…

vue3-pinia使用(末尾有彩蛋)

什么是 pinia Pinia 是 Vue 的专属状态管理库&#xff0c;它允许你跨组件或页面共享状态。 之前用的是 vuex&#xff0c;后面 vue 官方团队不维护了&#xff0c;推荐使用 pinia 安装 yarn add pinia # 或者使用 npm npm install piniapnpm install piniaStore 是什么&#xf…

实验一 Python集成开发环境的搭建及可视化库的安装

一、安装集成开发环境 下载安装包 官方网址&#xff1a; Free Download | Anaconda 或者镜像网站下载&#xff08;较快&#xff09; https://repo.anaconda.com/archive/ 安装 配置环境变量 验证 输入&#xff1a; conda -V 二、下载pyecharts环境 点击 Anaconda Promp…

探索实战课程的魅力

在当今迅速变化的时代&#xff0c;学习不仅仅是获取知识&#xff0c;更是掌握实用技能的关键。随着在线学习的兴起&#xff0c;实战课程在培养学生实践能力方面发挥着越来越重要的作用。本文将探讨实战课程的魅力&#xff0c;以及它们对个人职业发展的巨大影响。 深度学习的机…

spring-boot之shiro安全框架配置使用

shiro架构&#xff08;外部&#xff09; shiro架构(内部) 具体API操作 获取当前的用户对象 Subject currentUser SecurityUtils.getSubject();通过当前用户拿到session Session session currentUser.getSession(); session.setAttribute("someKey", "aValu…

微信公众号运营必备工具合集

微信公众号运营必备工具合集 各位同学&#xff0c;想要成为一名合格的公众号运营&#xff0c;必须要搭建一个属于自己的运营工具库&#xff0c;可以在日常工作中最大限度的提高效率。 91微信编辑器 &#xff1a;http://bj.91join.com/ 壹伴助手&#xff1a;https://yiban.io…

在assembleRelease之前执行自定义任务

背景 在实际的Gradle项目开发中&#xff0c;我们总是会遇到一些需求&#xff0c;要在release编译的时候执行一些任务&#xff0c;但debug时不需要。然而&#xff0c;Gradle编译有自己的一套生命周期&#xff0c;比如Android项目的assembleRelease任务在编译启动之前是没有办法…

下载及安装PHP,composer,phpstudy,thinkPHP6.0框架

文章目录 前言 thinkPHP是一款开源的PHP框架&#xff0c;它是基于MVC&#xff08;Model-View-Controller&#xff09;设计模式构建的。thinkPHP提供了丰富的功能和组件&#xff0c;使得开发人员可以快速、高效地构建和维护Web应用程序。 以下是thinkPHP框架的一些特点和功能&…

2023年欧亚地区网络安全态势综述

文 | 中国社会科学院俄罗斯东欧中亚研究所研究员 肖斌&#xff1b;中国社会科学院大学国际政治经济学院研究助理 刘聪 网络安全问题是一个复杂的问题&#xff0c;不仅涉及技术发展&#xff0c;也包含诸多政治色彩。尽管数字空间拉近了互联用户的距离&#xff0c;但是在国际政治…

上位机图像处理和嵌入式模块部署(qmacvisual测量标定)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在机器视觉中,测量是很重要的一个环节。如果是简单的定位,可能精度要求并不那么严格。但是如果是对产品进行QA测量,需要精确到0.1mm,甚至是0.05mm这样的精度,那就需要对camera…

蓝队面经(一)

蓝队面经(一) 文章目录 蓝队面经(一)入侵排查思路windows入侵排查思路Linux入侵排查思路 Linux 如何查看登录日志Windows 和 Linux 的日志文件放在哪里&#xff1f;WindowsLinux Linux 常用排查命令有哪些&#xff1f;Linux 的 Selinux 是什么&#xff1f;如何设置 Selinux&…

【Leetcode】2952. 需要添加的硬币的最小数量

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 给你一个下标从 0 0 0 开始的整数数组 c o i n s coins coins&#xff0c;表示可用的硬币的面值&#xff0c;以及一个整数 t a r g e t target target 。 如果存在某个 c o i …

剑指Offer题目笔记21(计数排序)

面试题74&#xff1a; 问题&#xff1a; ​ 输入一个区间的集合&#xff0c;将重叠的区间合并。 解决方案&#xff1a; ​ 先将所有区间按照起始位置排序&#xff0c;然后比较相邻两个区间的结束位置就能知道它们是否重叠。如果它们重叠就将它们合并&#xff0c;然后判断合并…

精选2024年最佳项目管理系统!实用推荐与详细评测

随着企业规模的扩大&#xff0c;项目量也会呈几何倍的增长&#xff0c;项目管理系统就成了企业管理必不可少的一部分。2024年优秀的项目管理系统推荐。今年为大家带来Microsoft Project、Zoho Projects、Jira以及Wrike项目管理系统评测。 什么是项目管理系统&#xff1f; 项目…

怎么更新sd-webui AUTOMATIC1111/stable-diffusion-webui ?

整个工程依靠脚本起来的&#xff1a; 可直接到stable-diffusion-webui子目录执行&#xff1a; git pull更新代码完毕后&#xff0c;删除venv的虚拟环境。 然后再次执行webui.sh&#xff0c;这样会自动重新启动stable-diffusion-webui.

springboot心灵治愈交流平台

摘 要 本论文主要论述了如何使用JAVA语言开发一个心灵治愈交流平台 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述心灵治愈交流平台的当前背景以及系统开发的…

代码随想录算法训练营第三十二天|leetcode738题

一、leetcode第738题 本题要求返回小于等于给定数字且从最高位到最低位呈单调递增的数值&#xff0c;需要从最低位向最高位遍历&#xff0c;如果最低位比其前一位小则若要使改变后数值最大需要将前一位作减一操作并记录下当前位&#xff0c;在遍历结束后将记录的当前位之后的所…

啥是MCU,MCU科普

啥是MCU&#xff0c;MCU科普 附赠自动驾驶学习资料和量产经验&#xff1a;链接 MCU是Microcontroller Unit 的简称&#xff0c;中文叫微控制器&#xff0c;俗称单片机&#xff0c;是把CPU的频率与规格做适当缩减&#xff0c;并将内存、计数器、USB、A/D转换、UART、PLC、DMA等…

Leetcode 42.接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图&#x…

多线程(19)活锁和线程饥饿

活锁&#xff08;Livelock&#xff09;和线程饥饿&#xff08;Thread Starvation&#xff09;是并发编程领域中两个至关重要且常见的问题。理解这两个概念&#xff0c;以及它们如何影响程序的执行和系统的性能&#xff0c;对于开发能够有效并行处理任务的应用程序至关重要。 1…