Spring Security 里的 HttpSecurity 类
在项目中实际使用Spring Security时,我们的大部分工作其实都是配置HttpSecurity。要么通过spring的 http xml element 来配置,要么通过配置类里的HttpSecurity class来配置,所以在理解了DelegatingFilterProxy,FilterChainProxy,SecurityFilterChain之间的关系之后就很有必要了解一下HttpSecurity类了。
HttpSecurity这个类的名称与它的实际功用相差甚远,其实把它称为HttpSecurityFilterChainBuiler应该更合适,因为它的作用就是利用构造器模式构造出SecurityFilterChain的一个实例供FilterChainProxy使用。这点从它的类签名就能看出来。
如果有多个 SecurityFilterChain 被配置、构造出来,它们的顺序可以通过注解 @Order来设定。没有@Order注解的优先级最低。同一order层级的,就可以通过 SecurityFilterChain 中的RequestMatcher 来决定了该chain是否与http request匹配了。我们应该尽量把特殊的匹配放在前面,通用的放在后面。
1) 体会下HttpSecurity源码的定义部分:
2) 用xml配置http security:
虽然现在基于Spring的开发都是基于注解的了,但是如果遇到遗留系统里通过http元素来定义HttpSecurity,那么俯视一下下面的schema应该也能大致了然了......
3) fitlers 的顺序定义:
4) HttpSecurity build filter的套路
看看与 authentication 相关的两个fitler的构建。 1)从两个filter看规律 Filter都是根据Configurer构建出来的。我们以BasicAuthenticationFilter和UsernamePasswordAuthenticationFilter的Configurer举例。 FormLoginConfigurer 比较“特殊”,它定义了两个filter。一个是UsernamePasswordAuthenticationFilter, 一个是DefaultLoginPageGeneratingFilter,后者提供了一个让用户输入credential页面的filter。
public FormLoginConfigurer<HttpSecurity> formLogin() throws Exception {
return getOrApply(new FormLoginConfigurer<>());
}
public HttpBasicConfigurer<HttpSecurity> httpBasic() throws Exception {
return getOrApply(new HttpBasicConfigurer<>());
}
FormLoginConfigurer 是 AbstractAuthenticationFilterConfigurer 的子类,
HttpBasicConfigurer是AbstractHttpConfigurer。这是因为basic的认证方式比起form形式的认证要简单得多。
public final class FormLoginConfigurer<H extends HttpSecurityBuilder<H>> extends
AbstractAuthenticationFilterConfigurer<H, FormLoginConfigurer<H>, UsernamePasswordAuthenticationFilter> {
public abstract class AbstractAuthenticationFilterConfigurer<B extends HttpSecurityBuilder<B>, T extends AbstractAuthenticationFilterConfigurer<B, T, F>, F extends AbstractAuthenticationProcessingFilter>
extends AbstractHttpConfigurer<T, B> {
public final class HttpBasicConfigurer<B extends HttpSecurityBuilder<B>> extends AbstractHttpConfigurer<HttpBasicConfigurer<B>, B> {
负责根据这些configuer构造出对象来的类是AbstractConfiguredSecurityBuilder。
public abstract class AbstractConfiguredSecurityBuilder<O, B extends SecurityBuilder<O>> extends AbstractSecurityBuilder<O> {
2) 没有被使用的AuthenticationFilter
在Spring Security 的源码里没有看到 AuthenticationFilter 被使用。这是要让程序员通过提供自定义的 authenticationConverter 和 authenticationManagerResolver 来使用吧。 对比三个与authentication相关的fitler体会下。
BasicAuthenticationFilter:
UsernamePasswordAuthenticationFitler
AuthenticationFilter
下一篇聊下Spring Security里与认证相关classes的逻辑关系。
References: [1]: https://docs.spring.io/spring-security/reference/servlet/configuration/java.html#jc-httpsecurity [2]: https://docs.spring.io/spring-security/reference/servlet/configuration/java.html#_multiple_httpsecurity [3]: https://docs.spring.io/spring-security/reference/servlet/configuration/java.html#jc-custom-dsls [4]: https://www.baeldung.com/spring-onceperrequestfilter
References: [1]: https://docs.spring.io/spring-security/reference/servlet/configuration/java.html#jc-httpsecurity [2]: https://docs.spring.io/spring-security/reference/servlet/configuration/java.html#_multiple_httpsecurity [3]: https://docs.spring.io/spring-security/reference/servlet/configuration/java.html#jc-custom-dsls
相关文章
- Spring学习笔记(五)——JdbcTemplate和spring中声明式事务
- Spring 全家桶之 Spring Boot 2.6.4(九)- 启动流程解析
- Spring 全家桶之 Spring Security(二)
- Spring Framework 源码学习笔记(四)
- Spring读源码系列番外篇09--BeanWrapper的应用
- 基于spring-security的微服务鉴权中心
- Spring Boot + minio 实现高性能存储服务,So Easy~!
- Spring Security 入门(一)Spring Security中的认证与密码编码器
- spring与mybatis整合
- Spring Security 之防漏洞攻击
- 【说站】Spring Framework 6 将采用 Java 17
- Spring Security 在 Servlet 的作用区域
- 微信官方你真的懂OAuth2?Spring Security OAuth2整合企业微信扫码登录
- 微服务网关与用户身份识别,JWT+Spring Security进行网关安全认证
- Spring+Spring MVC+MyBatis_java的图书管理系统
- spring cloud 配置中心配置哪些东西_druid连接池配置优化
- springspring boot拷贝实体的工具类---BeanObjectCopyUtils
- Spring:AOP
- Spring Cloud Gateway高可用的实现
- Spring Security的基本概念和特点
- Spring Cloud Security OAuth2 中实现密码模式
- Spring Cloud Security OAuth2 中实现客户端模式
- Spring Cloud Security配置JWT和OAuth2的集成实现授权管理(四)
- Spring Cloud Security监控示例-安全度量指标示例
- Spring Cloud Security使用Spring Cloud Config集中管理安全配置
- Spring Security 的核心组件UserDetailsService(一)
- Spring Security 的 Filter 链和 Filter 顺序(二)
- Spring Security用户认证和授权(一)
- Spring Cloud Data Flow配置数据源、应用程序、任务
- Spring AOP:基于AspectJ注解开发
- Spring Security 多登录实现详解编程语言
- 【Dubbo实战】集成Dubbo服务(Spring)详解大数据
- Spring难以理解的问题总结详解编程语言
- Spring详解(二)——IOC控制反转编程语言
- Spring Boot(五):spring data jpa的使用详解编程语言
- Spring Security访问控制详解编程语言
- Spring Boot 2 快速教程:WebFlux 集成 Thymeleaf(五)
- Spring实现文件上传(示例代码)