《Spring Security教程系列》二.初識Java 配置
Java配置使用and()方法相當於XML標籤的關閉,這樣允許我們繼續配置父類節點。如果你閱讀程式碼他很合理,我想配置請求驗證,並使用表單和HTTP基本身份驗證進行登入。
Java配置和表單登入
因此使用Java程式碼配置Spring Security主要是這兩個步驟:
1、建立過濾器
2、註冊過濾器。
1.第一步建立過濾器
這段配置建立一個Servlet Filter:springSecurityFilterChain,其負責應用中的所有安全,包括:保護應用的URLS,驗證提交的username和password,重定向到登入頁面等。通過以下程式碼可以看到使用Java配置Spring Security的基礎案例:
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
}
}
方法名 configureGlobal是無關緊要的,重要的是在一個添加了 @EnableWebSecurity註解的類裡面,注入 AuthenticationManagerBuilder。這段程式碼內容很少,但事實上已經做了很多的預設安全驗證,包括:
1、訪問應用中的每個URL都需要進行驗證
2、生成一個登陸表單
3、允許使用者使用username和password來登陸
4、允許使用者登出
5、CSRF攻擊攔截
6、 Session Fixation攻擊
7、 安全Header整合
1. [email protected]
當我們在任意一個類上添加了一個註解@EnableWebSecurity,就可以建立一個名為 springSecurityFilterChain 的Filter。我們是在一個自定義的SecurityConfig類上加了這個註解。SecurityConfig類同時也繼承了WebSecurityConfigurerAdapter類,不過需要注意的是,這個過濾器的建立是通過@EnableWebSecurity完成的,與是否繼承這個類無關.
實現EnableWebSecurity的原始碼中加上了@Configuration、@EnableGlobalAuthentication、@Import三個註解,所以使用@EnableWebSecurity就相當於同時加上了這三個註解。
總結: @EnableWebSecurity的作用實際上是,建立一個Spring Bean,Bean的型別是Filter,名字為springSecurityFilterChain。只要我們保證自定義的SecuirtyConfig類,可以被Spring掃描到,就可以幫助我們建立這個Filter了。
1.2 springSecurityFilterChain 過濾器的型別是什麼
Filter的建立時通過WebSecurity物件的build方法完成的,WebSecurity由WebSecurityConfiguration建立,而WebSecurity的作用是用於建立一個型別為FilterChainProxy的過濾器,FilterChainProxy是Filter的子類,我們所說的建立一個名字為springSecurityFilterChain的過濾器,實際上過濾器的具體型別就是FilterChainProxy
2.註冊過濾器
下一步是註冊springSecurityFilterChain。這個可以藉助Spring3.1引入的WebApplicationInitializer完成。SpringSecurity提供了一個基類 AbstractSecurityWebApplicationInitializer來確保 springSecurityFilterChain被註冊。
專案中已經使用了SpringMvc
如果在我們的應用程式中已經使用了Spring,那麼在我們的應用中可能已經有了一個 WebApplicationInitializer來載入我們的配置,如果我們還使用之前的程式碼,將會出現一個錯誤。此時我們應該在已經存在的ApplicationContext中註冊Spring Security。例如,如果我們已經使用SpringMvc,那麼我們的程式碼應該是如下所示:
import org.springframework.security.web.context.*;
public class SecurityWebApplicationInitializer
extends AbstractSecurityWebApplicationInitializer {
}