当前位置:   article > 正文

SpringSecurity的WebSecurity和HttpSecurity_websecurityconfig securityfilterchain

websecurityconfig securityfilterchain

前言:WebSecurity和HttpSecurity本质上都是SecurityBuilder.需要通过SecurityConfigurer来配置。

  1. //摘自AbstractConfiguredSecurityBuilder
  2. protected final O doBuild() throws Exception {
  3. init();
  4. configure();
  5. O result = performBuild();
  6. return result;
  7. }
  8. }
  9. private void init() throws Exception {
  10. for (SecurityConfigurer<O, B> configurer : configurers) {
  11. configurer.init((B) this);
  12. }
  13. }
  14. private void configure() throws Exception {
  15. for (SecurityConfigurer<O, B> configurer : configurers) {
  16. configurer.configure((B) this);
  17. }
  18. }

故事开始!一切都要从WebSecurityConfiguration讲起。

1.该方法把所有的WebSecurityConfigurer,都加到WebSecurity中。

  1. @Autowired(required = false)
  2. public void setFilterChainProxySecurityConfigurer(
  3. ObjectPostProcessor<Object> objectPostProcessor,
  4. List<SecurityConfigurer<Filter, WebSecurity>> webSecurityConfigurers)
  5. throws Exception {
  6. ......
  7. for (SecurityConfigurer<Filter, WebSecurity> webSecurityConfigurer : webSecurityConfigurers) {
  8. webSecurity.apply(webSecurityConfigurer);
  9. }
  10. this.webSecurityConfigurers = webSecurityConfigurers;
  11. }

2.WebSecurity完成使命(生成过滤器),此时会调用WebSecurityConfigure的init()和configure()方法。

  1. public Filter springSecurityFilterChain() throws Exception {
  2. ...
  3. return webSecurity.build();
  4. }

好了,现在把目光转移到WebSecurityConfigurerAdapter的init()。

  1. public void init(final WebSecurity web) throws Exception {
  2. final HttpSecurity http = getHttp();
  3. web.addSecurityFilterChainBuilder(http);
  4. }

这个方法很重要。1.生成了HttpSecurity。2.把HttpSecurity和WebSecurity联系到了一起。

我们先来看看HttpSecurity是如何生成的。

  1. protected final HttpSecurity getHttp() throws Exception {
  2. if (http != null) {
  3. return http;
  4. }
  5. ...
  6. http = new HttpSecurity(objectPostProcessor, authenticationBuilder,
  7. sharedObjects);
  8. ...
  9. configure(http);
  10. return http;
  11. }

调用了WebSecurityConfigurerAdapter.configure(HttpSecurity)方法。注意:WebSecurityConfigurerAdapter还有一个configure(WebSecurity)方法,不要混淆。

再来看看WebSecurity是如何使用HttpSecurity的。

  1. 摘自WebSecurity
  2. protected Filter performBuild() throws Exception {
  3. ...
  4. for (SecurityBuilder<? extends SecurityFilterChain> securityFilterChainBuilder : securityFilterChainBuilders) {
  5. securityFilterChains.add(securityFilterChainBuilder.build());
  6. }
  7. FilterChainProxy filterChainProxy = new FilterChainProxy(securityFilterChains);
  8. Filter result = filterChainProxy;
  9. return result;
  10. }

可以看到调用了HttpSecurity的build(),此方法又会调用HttpSecurity内的SecurityConfigurer来完成对它的配置。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号