`
tasha5151
  • 浏览: 530 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Spring security中的configurer讲解

 
阅读更多
在spring security的加载中使用到了WebSecurityConfiguration、WebSecurityConfigurerAdapter、HttpSecurity、WebSecurity、SecurityBuilder、SecurityConfigurer、AbstractConfiguredSecurityBuilder等配置相关的核心类。
这些类又使用了泛型,导致刚刚接触时代码阅读起来很费劲。
SecurityBuilder用于创建安全相关的对象,比如HttpSecurity是创建DefaultSecurityFilterChain的,WebSecurity是创建Filter的。而我们知道filter本身是基于修饰模式的,所以无论DefaultSecurityFilterChain还是Filter,都可以给它做成层层嵌套的方式,所以为了定制这些嵌套的层级,把它们的buidler类做成了可配置的,也就是AbstractConfiguredSecurityBuilder,所以我们看AbstractConfiguredSecurityBuilder的类声明是AbstractConfiguredSecurityBuilder<O, B extends SecurityBuilder<O>>,泛型里的O是指要生成的对象,B则是表示生产者本身,实际上是为了“可配置”这个特性。
这时可以看看SecurityConfigurer这个类了,这个类被AbstractConfiguredSecurityBuilder聚合,意味着一个AbstractConfiguredSecurityBuilder可以被多个定制器做定制,在创建目标对象之前,会先调用各个configurer的configure方法,各个configurer生成自己的filter作为配置的结果。
再看看WebSecurity也是一个builder,它要生成的对象是servlet的Filter,最终返回的是FilterChainProxy。FilterChainProxy代理的是什么呢,SecurityFilterChain。SecurityFilterChain本身是一个链条,FilterChainProxy代理的是多个链条。WebSecurity.addSecurityFilterChainBuilder方法,每调用一次就会添加一个链条的builder。一般来说只有一个builder,也就是只有一个链条,这个buidler就是HttpSecurity。
HttpSecurity,首先它是一个builder,它要生成的对象是DefaultSecurityFilterChain,然后它是一个可配置的builder,给自己所有可配置的特性都提供了语义明确的接口。
WebSecurityConfiguration是spring security配置的入口,它负责创建一个buidler,即WebSecurity,同时给这个builder加上配置器(SecurityConfigurer),这个配置器是个大家伙,也就是我们需要重写的WebSecurityConfigurerAdapter。WebSecurityConfiguration调用WebSecurity.build的时候,WebSecurityConfigurerAdapter创建HttpSecurity这个builder,并将HttpSecurity这个builder加到了WebSecurity的securityFilterChainBuilder列表中。WebSecurity创建FilterChainProxy,并将securityFilterChainBuilder所创建的filterChain都加到这个proxy中。这个是创建FilterChainProxy的过程,这个proxy本质是一个filter,最终被SecurityFilterAutoConfiguration所创建的代理filter封装了之后注册到servlet容器。

下面看看HttpSecurity创建FilterChain的过程。
WebSecurityConfigurerAdapter创建HttpSecurity的时候,默认加了一堆的configurer进去,也就意味着,HttpSecurity所创建出来的filterChain默认会有一堆的filter。
http
.csrf().and()
.addFilter(new WebAsyncManagerIntegrationFilter())
.exceptionHandling().and()
.headers().and()
.sessionManagement().and()
.securityContext().and()
.requestCache().and()
.anonymous().and()
.servletApi().and()
.apply(new DefaultLoginPageConfigurer<>()).and()
.logout();


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics