Spring Security 核心解读(一)整体架构

news2024/11/24 20:07:24

Spring Security 整体架构

    • 前提
    • 整体架构
      • Servlet 整体的过滤器模型
      • Security 过滤器链
      • 自定义过滤器
    • 实际开发解决方案
      • 一个替代cookie认证的filter
      • 其他组件,后续抽时间再整理整理

前提

开源项目一手文档基本都在github,标准文档基本都在官网。
最好的文档就是官网;
在前些年,Apache下还有个比较流行的权限框架 Shiro,但是随着Spring Security (以下简称 Security)的流行,逐渐边缘化。其实这类框架整体设计都大差不差,都是基于一系列的过滤器或者其他拦截手段实现增强。

整体架构

Servlet 整体的过滤器模型

在这里插入图片描述
这一块属于 Servlet 基础,过滤器算是Servlet核心功能之一,需重点掌握。

Security 过滤器链

Security 在 Servlet 过滤器上定义了一个 自己的过滤器(这个过滤器使用了委托者设计模式)
在这里插入图片描述
可以看到,Servlet 过滤器链上,不仅有 Security 的过滤器还有 Spring Boot 的一些过滤器,但是这里我们重点关注圈起来的那个过滤器(链)
再对比官方的这个图
在这里插入图片描述
就更好理解了。

自定义过滤器

我们自定义的过滤器基本都是在 Security 这个过滤器链上面的,通过编排不同的顺序,实现想要的功能。
在这之前,我们先看看Security默认的过滤器链上有哪些过滤器官方列表
这里为了照顾,访问不了官网的,简单截个图。
在这里插入图片描述
在这里插入图片描述
但不是所有过滤器默认都开启了的。
在这里插入图片描述
上面那个链是,Spring 全局的过滤器链,里面第四个过滤器委托给了下面那个 Security 的过滤器链,在 Security 的过滤器链中,可以看到默认有14个过滤器。
其中有几个重点关注的是:

  • SecurityContextPersistenceFilter (即将过时,替代者为 SecurityContextHolderFilter),其功能为,支持默认的基于 Cookie 的登录形式;对于新接触认证授权的开发者,要明白一点,不管什么实现方案,每一次进行鉴权,其本质会进行一次登录认证,只是方式不同而已
  • LogoutFilter 注销登录的过滤器,默认的url为 /logout,要实现自定义退出可以参考
  • UsernamePasswordAuthenticationFilter 大部分开发者,开始接触 Security 都是模仿这个 过滤器实现的自定义登录
  • AnonymousAuthenticationFilter 在 Security 中,认证没有通过或者没有匹配上认证过滤器的请求,最终会被定义为匿名认证,这也是一种认证结果,在权限中也有相关的配置。

其他的过滤器根据自己的需求,调整。

实际开发解决方案

在实际开发中,目前通常采用前后端分离的形式;有的前端对Cookie 不太友好;因此,为了统一,大部分开发者会采用 header 认证方式。
这样实现起码会有两个点需要调整

  1. 调整默认认证成功的处理方式
    默认配置下,认证成功会跳转到一个指定的页面;现在大多会把这个跳转交给前端。
  2. 改为header 传递认证参数后,默认的过滤器就不支持了,需要顶一个一个 过滤器,解析header,并进行认证;个人推荐将这个认证过滤器放在
    AnonymousAuthenticationFilter 的前面,因为前面还有些其他认证过滤器,如果自定义的过滤器太靠前,可能会被其他认证过滤器(比如上面提到的 SecurityContextPersistenceFilter 以及 SecurityContextHolderFilter)给覆盖掉认证信息,当然这要取决实际的优先级,万一你就想自定义的认证认证过滤器优先级低一点呢
    在这里插入图片描述
    可以看到,这两个认证过滤器不管你是否已经认证,会直接覆盖掉认证信息。

一个替代cookie认证的filter

提供一个简单实现,具体业务逻辑,开发者自己填充

package authorization.filter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Collections;

public class JwtAuthenticationFilter extends OncePerRequestFilter {
	private final Logger logger = LoggerFactory.getLogger(JwtAuthenticationFilter.class);

	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {
		String token = request.getHeader("token");
		if (!StringUtils.hasText(token)) {
			filterChain.doFilter(request, response);
			return;
		}
		try {
			UsernamePasswordAuthenticationToken authenticationToken
					= UsernamePasswordAuthenticationToken.authenticated("zhangsan", "zs", Collections.emptyList());
			SecurityContext context = SecurityContextHolder.createEmptyContext();
			context.setAuthentication(authenticationToken);
			SecurityContextHolder.setContext(context);
			filterChain.doFilter(request, response);
		}
		finally {
			SecurityContextHolder.clearContext();
		}
	}

	@Override
	protected boolean shouldNotFilterErrorDispatch() {
		return true;
	}
}

其他组件,后续抽时间再整理整理

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

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

相关文章

在Centos Stream 9上Docker的实操教程 - Docker的常用命令

在Centos Stream 9上Docker的实操教程 - Docker的常用命令 Docker启动类命令Docker镜像命令镜像列表 docker images镜像查找 docker search拉取镜像 docker pull删除镜像 docker rmi查看占用信息 docker system df容器创建新镜像 docker commit 容器命令启动容器 docker run查看…

【历史上的今天】4 月 27 日:Tumblr 上线;施乐推出了 Star 工作站;第一台安德伍德打字机诞生

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 4 月 27 日,在 1791 年的今天,摩斯电码的共同发明者、电报发明者塞缪尔摩斯(Samuel Morse)诞生。摩斯最开始是一…

基于springboot + vue 的学生成绩管理系统

基于springboot vue实现的学生成绩管理系统 主要模块: 1)学生模块:我的成绩、成绩统计、申述管理、修改密码 2)教师模块:任务管理、对学生班级任务安排、班级学生的成绩查看、申述管理 3)管理员模块&…

Vue自定义插件的使用

通过 Vue 实例绑定方法: 在 plugins.js 文件中创建 filter 过滤器,定义一个只返回前四个字符的方法。 export default {install(Vue){// 定义过滤器Vue.filter(mySlice,function(value){return value.slice(0,4);})} } 由于我们之前在 main.js 文件中引入…

六级备考20天|CET-6|翻译练习|真题·红楼梦|8:50~9:08+11:33~12:00

目录 1 中文 2 英文​ 3 解析 4 订正 ​ 1 中文 漏翻译:具有很强的艺术感染力! 2 英文 3 解析 tell 讲述 tragic love story 悲剧性爱情故事 own painful personal experience 自己痛苦的个人经历 major/minor characters 主要/次要人物 be viv…

SSH爆破攻击及应急响应/事件处置

提示:本文是我做的笔记,有问题可以留言 目录 前言一、什么是SSH?二、开始前的准备1.扫描2.准备爆破3.准备ssh登录登陆后的准备nc反弹 应急响应/事件处置1.查看网络连接情况2.查看守护进程3.删除,结束异常后门4.修改密码 总结 前言…

day40_servlet

今日内容 零、 复习昨日 一、注解 二、改造项目 三、请求转发 四、重定向 零、 复习昨日 一、注解(Annotation) 注解,又称为注释.它是给程序看的注释. JDK1.5后才出现的,作用是为了提高开发效率的,如何做到?(一个注解可以简化很多很多代码…) 常见注解: Override 1.1 自定义注…

Linux基础开发工具之软件包管理器

目录 前言 1.什么是软件包 2.软件下载的三种方式 3. Linux软件生态 4. 使用yum安装软件 5.yum源的相关介绍 总结: 前言 Linux作为一款操作系统,其自然也和我们其他的操作系统一样需要安装对应得软件去满足我们的需求,因此为了更好的下载…

ICV报告: ADAS SoC市场规模将在2024年迎来较大突破

随着先进驾驶辅助系统(ADAS)的出现和对于自动驾驶的追求,汽车行业正在经历快速转型。这些技术进步的核心是ADAS SoC,它是实现多个功能集成于单一平台的关键组件。ADAS SoC已经成为智能汽车的重要驱动因素,彻底改变了安…

ArduPilot开源代码之H743+BMI270x2+ChibiOS配置适配

ArduPilot开源代码之H743BMI270x2ChibiOS配置适配 1. 源由2. 配置适配2.1 bootloader配置2.2 flight controller配置 3. 4.3.6固件编译Step 1: 获取源代码Step 2: 准备编译环境Step 3: 复制配置文件Step 4: 编译bootloaderStep 5: 编译飞控 4. 基础配置4.1 机型配置4.2 IMU校准…

通过python采集lazada商品详情数据接口,支持多站点。

为了采集Lazada商品详情,您可以使用Python的网络爬虫库(例如BeautifulSoup、Scrapy等)来获取页面内容。以下是基本步骤: 安装所需的Python库(例如requests、BeautifulSoup等)。使用requests库发送GET请求并…

C/C++开发,libiec61850库学习及运用

目录 一、libiec61850库下载编译 1.1 下载 1.2 linux编译: 1.3 win编译 二、案例编译测试 2.1 CMakeLists.txt调整(server_example_goose) 2.2 模型static_model.h/static_model.cpp生成 2.3 案例编译(server_goose) 2.4 客户端编译 2.5 运行测试 一、libiec61850…

SAP-MM 条件类型字段解析

01、“定价类型”:定义此条件类型的代码和描述,代码不能重复,描述可更改,根据实际需要,条件类型可定制; 02、“存取顺序”:表示此条件类型在定价时,要到存取顺序号定义的条件表中读…

学C的第二十二天【深度剖析数据在内存中的存储:1. 数据类型介绍;2. 整型在内存中的存储】

相关代码gitee自取:C语言学习日记: 加油努力 (gitee.com) 接上期:学C的第二十一天【初阶测评讲解:1. 计算递归了几次;2. 判断 do while 循环执行了几次;3. 求输入的两个数的最小公倍数;4. 将一句话的单词进…

day39_servlet

今日内容 零、复习昨日 一、接收请求 二、处理响应 三、综合案例 零、复习昨日 见晨考 一、接收请求 浏览器发出请求,经过web.xml映射匹配,找到Servlet对应的方法(doGet/doPost),接收请求数据,可以接收请求中的请求行,请求头,请求正文,具体流程如下 浏览器发出请求 …

OpenAI ChatGPT API + FaskAPI SSE Stream 流式周转技术 以及前端Fetch 流式请求获取案例

先填坑,一贯习惯 nginx如果要支持SSE,要调整一些参数 conf配置文件,AI给的,具体自己没搭,应该是正确的 nginx worker_processes 1;events {worker_connections 1024; }http {include mime.types;default_typ…

Ubuntu下编译运行MicroPython Unix版本

文章目录 github拉取源码更新模块编译运行 github拉取源码 到Github(https://github.com/micropython/micropython)上下载源码 终端输入,如果提示识别不到gh命令,就sudo apt-get install gc安装一下。 再根据提示在终端里登录自己的github账号。 再次…

Hystrix 服务熔断

书籍,人,借阅服务之间相互调用, 高度耦合, 一旦一个服务故障, 其他服务会雪崩, 和多米诺骨牌一样 Hystrix 熔断器, 保险丝 服务降级 提供补救措施发给请求者, 服务可用, 能力下降了 borrow-service 导入依赖 <dependency><groupId>org.springframework.cloud&l…

linux kernel pwn 常用结构体

tty 设备结构体 tty 设备在 /dev 下的一个伪终端设备 ptmx 。 tty_struct&#xff08;kmalloc-1k | GFP_KERNEL_ACCOUNT&#xff09; tty_struct 定义如下 。 /* tty magic number */ #define TTY_MAGIC 0x5401struct tty_struct {int magic;...const struct tty…

python学习-基础知识总结

&#xff08;一&#xff09;基础语法 1.1、注释 程序添加注释&#xff0c;可以用来解释程序某些部分的作用和功能&#xff0c;提高程序的可读性&#xff0c;注释有两种形式&#xff1a; 单行注释&#xff1a;#多行注释&#xff1a;单引号&#xff08;注释内容&#xff09;或双…