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");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
方法名 configureGlobal是無關緊要的,重要的是在一個添加了 @EnableWebSecurity註解的類裏面,注入 AuthenticationManagerBuilder。這段代碼內容很少,但事實上已經做了很多的默認安全驗證,包括:
1、訪問應用中的每個URL都需要進行驗證
2、生成一個登陸表單
3、允許用戶使用username和password來登陸
4、允許用戶註銷
5、CSRF攻擊攔截
6、 Session Fixation攻擊
7、 安全Header集成
1. 1@EnableWebSecurity
當我們在任意一個類上添加了一個註解@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 {
}