Spring Security
Spring Security是基於Spring提供聲明式安全保護的安全性框架。Spring Security提供了完整的安全性解決方案,能夠在Web請求級別和方法調用級別處理身份認證和授權。
Spring Security從兩個角度來解決安全性問題:
- 使用Servlet規范中的Filter保護Web請求並限制URL級別的訪問;
- 使用Spring AOP保護方法調用——借助於動態代理和使用通知,確保只有具備適當權限的用戶才能訪問安全保護的方法。
Spring Security被分為了11個模塊:
模塊 | 描述 |
ACL(access control list) | 支持通過訪問控制列表(ACL)為域對象提供安全性 |
切面(Aspects) | 當使用Spring Security注解時,會使用基於AspectJ的切面,而非標准的AOP |
CAS(Central Authentication Service)客戶端 | 提供與Jasig的中心認證服務(CAS)進行集成的功能 |
配置(Configuratiion)* | 包含通過XML和Java配置Spring Security的功能支持 |
核心(Core) * | 提供Spring Security基本庫 |
加密(Cryptography) | 提供了加密和密碼編碼的功能 |
LDAP | 支持基於LDAP進行認證 |
OpenID | 支持使用OpenID進行集中式認證 |
Remoting | 提供了對Spring Remoting的支持 |
標簽庫(Tag Library) | Spring Security的JSP標簽庫 |
Web | 提供了Spring Security基於Filter的Web安全性支持 |
過濾Web請求
Spring Security基於DelegatingFilterProxy實現其安全性需要的過濾功能。DelegatingFilterProxy是一個特殊的Servlet Filter,主要將工作委托給一個javax.servlet.Filter實現類,實現類將作為一個bean注冊在Spring應用的上下文中。
Java配置方式,配置DelegatingFilterProxy:
public class SecurityWebInitializer extends AbstractSecurityWebApplicationInitializer {}
AbstractSecurityWebApplicationInitializer 實現了 WebApplicationInitializer ,因此將被Spring容器並注冊 DelegatingFilterProxy。實現類可以重載抽象類中的appendFilters()或insertFilters()方法來注冊自己選擇的Filter,但如果只是注冊DelegatingFilterProxy的話,不需要重載任何方法。
完成配置DelegatingFilterProxy后,它就會攔截發往應用中的請求,並將請求委托給ID為springSecurityFilterChain的Bean。
springSecurityFilterChain本身是另一個特殊的Filter,也叫 FilterChainProxy。它可以鏈接任意一個或多個其他的Filter。Spring Security依賴一系列Servlet Filter來提供不同的安全特性。實際開發中,只需要顯式聲明springSecurityFilterChain以及它所鏈接的Filter即可。啟動Web安全性時將自動創建。
簡單的安全性配置--基於Java配置
@Configuration @EnableWebSecurity // 啟用Web安全性 public class SecurityConfig extends WebSecurityConfigurerAdapter { /** * 簡單的默認配置:指定該如何保護HTTP請求 * @param http * @throws Exception */ protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated() .and() .formLogin().and() .httpBasic(); } }
@EnableWebSecurity注解將會啟用Web安全功能,ps:Spring Security必須配置在一個實現了WebSecurityConfigurer的bean中,或者擴展 WebSecurityConfigurerAdapter 。
具體的Web安全細節,將通過重寫WebSecurityConfigurerAdapter 中的一個或多個方法來實現,如其中的三個configure()方法來配置Web安全性,具體通過傳遞的參數設置行為。
方法 | 描述 |
configure(WebSecurity) | 通過重寫,配置Spring Security的Filter鏈 |
configure(HttpSecurity) | 通過重寫,配置如何通過攔截器保護請求 |
configure(AuthenticationManagerBuilder) | 通過重寫,配置user-detail服務 |
示例代碼中進行了簡單的默認配置,指定如何保護HTTP請求,以及客戶端認證用戶的方案。調用authorizeRequests()和anyRequest().authenticated()就會要求所有進入應用的HTTP請求都要進行認證。formLogin()和httpBasic()則配置了對表單登錄和HTTP Basic方式的支持。
注意:因為沒有重寫configure(AuthenticationManagerBuilder)方法,所以沒有用戶存儲支撐認證過程。進而所有的請求都要認證,且沒人可成功登陸。
后續需要的配置如下:
- 配置用戶存儲
- 指定具體需要認證的請求及所需權限
- 提供自定義登陸頁面
- 基於安全限制,設置選擇性地在Web視圖上顯示特定的內容
user-detail服務 **
優勢:內置了多種常見的用戶存儲場景,如內存、關系型數據庫以及LDAP,能夠基於各種數據存儲來認證用戶。