什麼? 就只是加了一個 Spring Security 依賴, 所有接口都無法訪問了?

開篇

前面我們寫了 4 篇 Spring Security 的實戰教程, 全部基於 Springboot 搭建的.

雖然我們學會了怎麼用, 但是裏面的原理還沒搞清楚.

因此, 從本文開始, 我們會基於 Spring SecuritySpringboot 的整合, 去逐步去學習 Spring Security 的工作原理.

正文

通過前面的 4 篇實戰教程, 我們暫時得到了如下結論:

  1. 當我們在項目中添加了 Spring Security 依賴後, 即使不做任何配置, 它也默認會幫我們攔截掉所有請求.
  2. 爲了修改 Spring Security 的默認行爲, 我們需要做一些配置, 也就是通過重寫 WebSecurityConfigurerAdapterconfigure(HttpSecurity http) 方法.

那麼問題來了, 爲什麼僅僅加了一個 Spring Security 依賴, 就可以攔截請求了?

答案自然跟 Springboot 的自動裝配有關係.

SecurityAutoConfiguration 裝配類

通過 @Import 註解, 可以找到 SpringBootWebSecurityConfiguration

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(DefaultAuthenticationEventPublisher.class)
@EnableConfigurationProperties(SecurityProperties.class)
@Import({ SpringBootWebSecurityConfiguration.class, WebSecurityEnablerConfiguration.class,
		SecurityDataConfiguration.class })
public class SecurityAutoConfiguration {

	@Bean
	@ConditionalOnMissingBean(AuthenticationEventPublisher.class)
	public DefaultAuthenticationEventPublisher authenticationEventPublisher(ApplicationEventPublisher publisher) {
		return new DefaultAuthenticationEventPublisher(publisher);
	}

}

SpringBootWebSecurityConfiguration 類

  1. @ConditionalOnMissingBean(WebSecurityConfigurerAdapter.class) 可以看出, 當項目中沒有配置 WebSecurityConfigurerAdapter 時, 這個配置類纔會生效.

  2. 當這個配置類生效後, 會幫我們配置一個默認的 WebSecurityConfigurerAdapter

  3. 由前面可知, 通過配置 WebSecurityConfigurerAdapter 可以實現定義攔截方式.

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(WebSecurityConfigurerAdapter.class)
@ConditionalOnMissingBean(WebSecurityConfigurerAdapter.class)
@ConditionalOnWebApplication(type = Type.SERVLET)
public class SpringBootWebSecurityConfiguration {

	@Configuration(proxyBeanMethods = false)
	@Order(SecurityProperties.BASIC_AUTH_ORDER)
	static class DefaultConfigurerAdapter extends WebSecurityConfigurerAdapter {

	}

}

WebSecurityConfigurerAdapter 的默認行爲

從下面的默認配置可以得知, 默認的配置是所有的請求都需要登錄認證.

protected void configure(HttpSecurity http) throws Exception {
	
    http
       .authorizeRequests()
       // 重點
       .anyRequest().authenticated()
       .and()
       .formLogin().and()
	.httpBasic();
    }

總結

當我們的 Springboot 工程引入 Spring Security 依賴後, 項目中的 “安全機制” 就已經開啓了.

因爲根據 Spring boot 的自動裝配原理, 在加載 SecurityAutoConfiguration 配置類時, 會再加載 SpringBootWebSecurityConfiguration 配置類.

而在 SpringBootWebSecurityConfiguration 類中, 默認幫我們初始化了一個WebSecurityConfigurerAdapter 類.

WebSecurityConfigurerAdapter 的有一個作用就是 配置訪問請求需要的權限.

如果不覆蓋此類的 configure(HttpSecurity http) 方法, 它的默認行爲就是 要求對所有的請求進行登錄認證.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章