天天看點

Spring Security 自動配置Spring boot 自動配置

Spring boot 自動配置

1. Spring Boot 項目啟動

項目啟動時會從spring-boot-autoconfigure/META-INF/spring.factories檔案中加載預設的配置類

org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\
org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientAutoConfiguration,\
           

2. SecurityAutoConfiguration

@Configuration
// 當有 DefaultAuthenticationEventPublisher 這個class的時候 這個配置類才會生效, 是以當項目依賴了spring-security-core時自動配置生效了。
@ConditionalOnClass({DefaultAuthenticationEventPublisher.class})
// 配置類 也就是 application.properties 那裡配置的 可以配置一個使用者的使用者名 密碼 和角色 隻能配置一個使用者
@EnableConfigurationProperties({SecurityProperties.class})
// 引入了其它配置類
@Import({SpringBootWebSecurityConfiguration.class, WebSecurityEnablerConfiguration.class, SecurityDataConfiguration.class})
public class SecurityAutoConfiguration {
    public SecurityAutoConfiguration() {
    }
    
    // 這裡這個Bean基本是會注入到容器中的 這個Bean是用來進行 成功 失敗 Event 發送事件的
    @Bean
    @ConditionalOnMissingBean({AuthenticationEventPublisher.class})
    public DefaultAuthenticationEventPublisher authenticationEventPublisher(ApplicationEventPublisher publisher) {
        return new DefaultAuthenticationEventPublisher(publisher);
    }
}
           

2.1 引入配置 SpringBootWebSecurityConfiguration

當沒有 WebSecurityConfigurerAdapter 實作類的Bean時 像容器中注入一個 DefaultConfigurerAdapter (WebSecurityConfigurerAdapter 的實作類 啥都沒做)

2.2 引入配置 WebSecurityEnablerConfiguration

@EnableWebSecurity 沒有被應用那麼,應用該注解@EnableWebSecurity(很重要), 是以這裡 自己實作WebSecurityConfigurerAdapter 時可以不用寫這個注解來啟用Security的噢

2.3 引入配置 SecurityDataConfiguration

這個配置類 不懂 有用到再看喽

  1. 注入Bean SecurityEvaluationContextExtension
  2. 引入配置類 SecurityEvaluationContextExtension
  3. 引入配置類 EvaluationContextExtensionSupport

3. UserDetailsServiceAutoConfiguration

AuthenticationManager, AuthenticationProvider, UserDetailsService 這三個Bean都沒有, 并且

ObjectPostProcessor Bean有的時候這個配置類才生效, 當然這個Bean是在 @EnableWebSecurity 引入的,後面就知道了,主要用來配置Bean的 (AutowireCapableBeanFactory 了解一下)

3.1 注入 InMemoryUserDetailsManager extends UserDetailsService

注入這個Bean 的前提是沒有 ClientRegistrationRepository(這個不知道幹啥的) 這個Bean, InMemoryUserDetailsManager 配置了配置檔案中的使用者資訊, 基于記憶體, passport 使用了編碼。

4. SecurityFilterAutoConfiguration

這個配置是在 SecurityAutoConfiguration 之後才進行的, 其主要目的是當 springSecurityFilterChain 這個Bean 存在那麼注入 DelegatingFilterProxyRegistrationBean

4.1 注入 DelegatingFilterProxyRegistrationBean

簡單的看了下應該是吧 springSecurityFilterChain 這個Bean 弄到servlet 裡面, 也就是讓過濾鍊生效吧

5. ReactiveSecurityAutoConfiguration 和 ReactiveUserDetailsServiceAutoConfiguration

異步的, 流式的? 不懂

6. OAuth2ClientAutoConfiguration

OAuth2 相關的吧

7. 總結

  1. 條件配置 (預設配置讓你使用預設功能)
  2. 預設或者自己使用 @EnableWebSecurity 啟用security功能 是以主要配置就是 @EnableWebSecurity 了
  3. 這裡注入的Bean 有(忽略條件)

    SecurityProperties, AuthenticationEventPublisher, DefaultConfigurerAdapter, InMemoryUserDetailsManager, DelegatingFilterProxyRegistrationBean, , SecurityEvaluationContextExtension

繼續閱讀