前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Security 里的 HttpSecurity 类

Spring Security 里的 HttpSecurity 类

作者头像
dhyuan
发布2023-01-11 15:29:43
5410
发布2023-01-11 15:29:43
举报
文章被收录于专栏:响应式编程

在项目中实际使用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。

代码语言:javascript
复制

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形式的认证要简单得多。

代码语言:javascript
复制

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。

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 响应式编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1) 体会下HttpSecurity源码的定义部分:
  • 2) 用xml配置http security:
  • 3) fitlers 的顺序定义:
  • 4) HttpSecurity build filter的套路
    • 2) 没有被使用的AuthenticationFilter
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档