Spring Security 6.1.x 系列(3)—— 基于过滤器的基础原理(二)

四、SecurityFilterChain

Serlvet中,一组Security Filter组成SecurityFilterChainSecurityFilterChain的概念就比较好理解,是Spring Security 提供的过滤器链,用于管理本身所有的过滤器,在上面的流程图中已有说明。

SecurityFilterChain可以被FilterChainProxy用来确定当前请求应该调用哪些Spring Security Filter实例。

在整个流程中, FilterchainProxy 决定应该使用哪个SecurityFilterChain,只有第一个匹配SecurityFilterChain被调用。如果请求的URL不匹配,则继续尝试每个SecurityFilterChain

比如在下图中,如果请求的URL/api/messages/,那么会匹配到右侧上方的 SecurityFilterChain0 ,如果都不匹配,则会调用支持 /*SecurityFilterChainn

在这里插入图片描述

五、Security Filters

Spring Security 中的过滤器是通过 SecurityFilterChain API 插入FilteChainProxy中的,Filter实例的顺序非常重要。

Spring Security 中的过滤器按照如下所示 (后续会详细介绍):

  • ForceEagerSessionCreationFilter
  • ChannelProcessingFilter
  • WebAsyncManagerlntegrationFilterSecurityContextPersistenceFilter
  • HeaderWriterFilter
  • CorsFilter
  • CsrfFilter
  • LogoutFilter
  • OAuth2AuthorizationRequestRedirectFilter
  • Saml2WebSsoAuthenticationRequestFilter
  • X509AuthenticationFilter
  • AbstractPreAuthenticatedProcessingFilter
  • CasAuthenticationFilter
  • OAuth2LoginAuthenticationFilter
  • Saml2WebSsoAuthenticationFilter
  • UsernamePasswordAuthenticationFilter
  • DefaultLoginPageGeneratingFilter
  • DefaultLogoutPageGeneratingFilter
  • ConcurrentSessionFilter
  • DigestAuthenticationFilter
  • BearerTokenAuthenticationFilter
  • BasicAuthenticationFilter
  • RequestCacheAwareFilter
  • SecurityContextHolderAwareRequestFilter
  • JaasApilntegrationFilter
  • RememberMeAuthenticationFilter
  • AnonymousAuthenticationFilter
  • OAuth2AuthorizationCodeGrantFilter
  • SessionManagementFilter
  • ExceptionTranslationFilterFilter
  • SecuritylnterceptorSwitchUserFilter

5.1 打印Security Filter

可通过以下配置:

@EnableWebSecurity(debug = true)

打印请求URL匹配SecurityFilterChain中的Security Filter信息。

5.2 将自定义Filter添加到SecurityFilterChain

大多数情况下,默认Security Filter足以为应用程序的安全性要求。 但是有时您可能希望将自定义Filter添加到SecurityFilterChain中。

一个简单的自定义Filter代码示例:

public class TenantFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;String tenantId = request.getHeader("X-Tenant-Id"); boolean hasAccess = isUserAllowed(tenantId); if (hasAccess) {filterChain.doFilter(request, response); return;}throw new AccessDeniedException("Access denied"); }
}

上面的示例代码执行以下操作:

  • 从请求头中获取租户ID。
  • 检查当前用户是否有权访问租户ID。
  • 如果用户具有访问权限,则调用链中的其余筛选器。
  • 如果用户没有访问权限,则抛出AccessDeniedException

将其添加到SecurityFilterChain代码示例:

@Configuration
@EnableWebSecurity(debug = true)
public class SecurityConfig {@Bean@Orderpublic SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http)throws Exception {http.formLogin(Customizer.withDefaults());http.passwordManagement(Customizer.withDefaults());// 将过滤器添加在AuthorizationFilter之前http.addFilterBefore(new TenantFilter(), AuthorizationFilter.class);return http.build();}
}

Filter使用@Component注解声明为 Spring Bean 时要特别注意。因为 Spring Boot会自动将其注册到容器中。 这可能会导致过滤器被调用两次,一次由容器调用一次由 Spring Security 调用,并且顺序不同。

如果您仍然想将将Filter声明为Spring bean以利用依赖注入,并避免重复调用,您可以通过FilterRegistrationBean并将其Enabled属性设置为false 来实现。

@Bean
public FilterRegistrationBean<TenantFilter> tenantFilterRegistration(TenantFilter filter) {FilterRegistrationBean<TenantFilter> registration = new FilterRegistrationBean<>(filter);registration.setEnabled(false);return registration;
}

六、处理安全异常

ExceptionTranslationFilter 允许将 AccessDeniedExceptionAuthenticationException 转换为 HTTP 响应。

ExceptionTranslationFilter作为Security Filter之一插入到 FilterChainProxy 中。

下图显示了与其他组件的关系。

在这里插入图片描述
①首先,调用应用程序的其余部分,正常继续处理请求。ExceptionTranslationFilterFilterChain.doFilter(request, response)

②如果用户未通过身份验证,或者是开启身份验证,抛出AuthenticationException异常:

  • SecurityContextHolder被清除。
  • 请求缓存,以便在身份验证成功后可用于重播原始请求。HttpServletRequest
  • 用于从客户端请求凭据。 例如,它可能会重定向到登录页面或发送请求头。AuthenticationEntryPointWWW-Authenticate

③否则拒绝访问, 调用AccessDeniedHandler处理被拒绝的访问。

七、身份验证间请求缓存

处理安全异常中所示,当请求没有身份验证并且针对需要身份验证的资源时,需要保存身份验证资源的请求缓存,以便在身份验证成功后重新请求。

Spring Security中,这是通过使用RequestCache实现保存来完成的。

7.1 请求缓存

RequestCacheAwareFilter用于保存RequestCache。当用户成功进行身份验证时,将用于重播原始请求。

一个简单的仅当参数存在时才检查已保存的请求代码示例:

@Bean
DefaultSecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {HttpSessionRequestCache requestCache = new HttpSessionRequestCache();requestCache.setMatchingRequestParameterName("continue");http// ....requestCache((cache) -> cache.requestCache(requestCache));return http.build();
}

7.2 阻止保存请求

您可能希望不要在会话中存储用户未经身份验证的请求或您始终希望将用户重定向到主页,而不是他们在登录前尝试访问的页面。为此可以使用NullRequestCache 实现。

@Bean
SecurityFilterChain springSecurity(HttpSecurity http) throws Exception {RequestCache nullRequestCache = new NullRequestCache();http// ....requestCache((cache) -> cache.requestCache(nullRequestCache));return http.build();
}

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

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

相关文章

【嵌入式】Linux C编程——C要注意的东西

1、语法分析中的“贪心法”&#xff1a; 编译器将程序分解成符号的方法是&#xff0c;从左到右一个字符一个字符地读入&#xff0c;如果该字符可能组成一个符号&#xff0c;那么再读入下一个字符&#xff0c;判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分&…

Lvs+Nginx+NDS

什么是&#xff1f;为什么&#xff1f;需要负载均衡 一个网站在创建初期&#xff0c;一般来说都是只有一台服务器对用户提供服务 ​ 从图里可以看出&#xff0c;用户经过互联网直接连接了后端服务器&#xff0c;如果这台服务器什么时候突然 GG 了&#xff0c;用户将无法访问这…

Python构造代理IP池提高访问量

目录 前言 一、代理IP是什么 二、代理IP池是什么 三、如何构建代理 IP 池 1. 从网上获取代理 IP 地址 2. 对 IP 地址进行筛选 3. 使用筛选出来的 IP 地址进行数据的爬取 四、总结 前言 爬虫程序是批量获取互联网上的信息的重要工具&#xff0c;在访问目标网站时需要频…

QT实现用本地资源管理器来打开文件夹

QString path"文件夹路径";QDesktopServices::openUrl(QUrl("file:"path, QUrl::TolerantMode)); 在windows中QT编程&#xff0c;使用资源管理器来打开指定本地文件夹的方法&#xff1a; 第一种&#xff1a;使用Qprocess命令&#xff08;相当于在cmd命令管…

【面试经典150 | 链表】反转链表 II

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;迭代 其他语言python3 写在最后 Tag 【头插法】【迭代】【链表】 题目来源 92. 反转链表 II 题目解读 返回部分链表。 解题思路 方法一&#xff1a;迭代 我们首先需要找到开始反转链表的前一个节点&#xff0c;为此…

React 你还在用 Redux 吗?更简化的状态管理工具(Recoil)

以往传统的 Redux 状态管理工具使用起来代码太过于复杂。 你需要通过纯函数触发 action 再去修改 data 中定义的数据&#xff0c;而且要通过接口请求数据还需要借助 redux - think 这个中间件才能完成。。。 更加方便使用的工具&#xff1a;Recoil ~ 由 facebook 推出契合 R…

【机器学习可解释性】5.SHAP值的高级使用

机器学习可解释性 1.模型洞察的价值2.特征重要性排列3.部分依赖图4.SHAP 值5.SHAP值的高级使用 正文 汇总SHAP值以获得更详细的模型解释 总体回顾 我们从学习排列重要性和部分依赖图开始&#xff0c;以显示学习后的模型的内容。 然后我们学习了SHAP值来分解单个预测的组成部…

CSS3背景样式

在CSS 2.1中&#xff0c;background属性的功能还无法满足设计的需求&#xff0c;为了方便设计师更灵活地设计需要的网页效果&#xff0c;CSS3在原有background基础上新增了一些功能属性&#xff0c;可以在同一个对象内叠加多个背景图像&#xff0c;可以改变背景图像的大小尺寸&…

最简单的驱动程序

简介 在 Linux 内核中,Makefile 和 Kconfig 是两个重要的文件,它们分别承担着不同的作用。 Makefile Makefile 是一个文本文件,用于定义编译和构建内核的规则。它使用 make 工具来管理和自动化构建过程。Makefile 定义了编译器、链接器、编译选项、目标文件、源文件等信息…

Flask后端开发(二) - 功能实现和项目总结

目录 1. 功能1:修改文件参数值1.1. 获取网页端传参1.2. 读取文件1.2.1. 一般文件读取方式1.2.2. 特殊文件 —— mlx文件1.2.3. 特殊文件 —— .xlx文件1.3. 查找数据修改位置,替换数据2. 功能2:读取结果数据2.1. 实时数据展示如何存储相关数据?2.2. 读取相关数据,整理、打…

[ubuntu系统下的文本编辑器nano,vim,gedit,文件使用,以及版本更新问题]

文本编辑器概要 在Ubuntu系统下&#xff0c;有许多文本编辑器可供选择&#xff0c;每个编辑器都有其独特的特性和用途。以下是一些常见的文本编辑器&#xff1a; Gedit&#xff1a; 这是Ubuntu默认的文本编辑器&#xff0c;它简单易用&#xff0c;适合基本的文本编辑任务。 安…

前端基础---跳转相关的功能

后端给链接地址并且给token进行跳转 如果点击有key4&#xff0c;说明要跳转到相应的页面 auth是通过后端获取的地址&#xff0c; jdk是后端获取的相应的token&#xff0c; 然后进行拼接&#xff0c;进行window.open&#xff08;&#xff09;进行跳转 if (key 4) {var testUrl …

基于RFID技术的优化医药供应链管理解决方案

一、社会背景和挑战 随着全球假药问题的严重性日益凸显&#xff0c;医疗产品的追溯和管理变得越来越重要。据世界卫生组织报告&#xff0c;全球假药比例已超过10%&#xff0c;而中国每年至少有20万人死于假药和不当用药。在国际上&#xff0c;医疗产品的追溯体系已成为监管机构…

如何解决ssh登录报错WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

原因&#xff1a; 当两个设备第一次进行链接时&#xff0c;会在~/.ssh/konwn_hosts 中将被连接设备的公钥信息进行保存&#xff0c;后续再次链接时OpenSSH会核对公钥来进行一个简单的验证 然而有时候被链接的那台设备系统被重装、IP 冲突等原因&#xff0c;会导致公钥信息没…

MLF - 麻辣粉

MLF全称中期借贷便利&#xff08;Medium-term lending Facility&#xff09;,理解为央行向商业银行、政策银行发放的贷款&#xff0c;但需要符合一定要求才可向央行申请。银行通过MLF向央行借款的时候&#xff0c;需要提供担保品。一般为国债、央行票据、政策性金融债、地方债、…

com.aspose.words for java添加页码

public void addHeaderFooter(Document doc){//创建页脚 页码HeaderFooter footer new HeaderFooter(doc, HeaderFooterType.FOOTER_PRIMARY);doc.getFirstSection().getHeadersFooters().add(footer);//页脚段落Paragraph footerpara new Paragraph(doc);footerpara.getPara…

数据库的用户管理

一、创建用户&#xff1a;create user 二、赋予用户权限&#xff1a;grant&#xff08;终端执行&#xff09; 三、删除用户权限&#xff1a;revoke&#xff08;在终端操作&#xff09; 四、用户的重命名&#xff1a;rename 五、删除用户&#xff1a;drop 六、修改用户密码 1、…

linux目录与文件管理

目录与路径 关于执行文件路径的变量&#xff1a;$PATH ls完整文件名为&#xff1a;/bin/ls 在任何文件夹下输入ls命令可以显示出一些信息而不是找不到命令&#xff0c;这就是因为环境变量PATH所致。在执行命令时&#xff0c;系统会依照PATH的设置去每个PATH定义的目录下查找文…

经典面试题:https为什么比http安全

HTTPS比HTTP安全的主要原因是它使用了加密技术来保护数据传输的安全性。下面是几个关键的安全特性&#xff1a; 数据加密&#xff1a;HTTPS使用SSL&#xff08;Secure Sockets Layer&#xff09;或TLS&#xff08;Transport Layer Security&#xff09;协议来对传输的数据进行加…

ORB-SLAM3算法2之EuRoc、TUM和KITTI开源数据集运行ORB-SLAM3生成轨迹并用evo工具评估轨迹

文章目录 0 引言1 数据和真值1.1 TUM1.2 EuRoc1.3 KITTI2 ORB-SLAM3的EuRoc示例2.1 纯单目的示例2.2 纯单目的轨迹评估2.3 纯双目的示例2.4 纯双目的轨迹评估2.5 单目和IMU的示例2.6 单目和IMU的轨迹评估2.7 双目和IMU的示例2.8 双目和IMU的轨迹评估2.9 前四种的评估结果对比3 …