1. 程式人生 > >《Spring Security教程系列》二.初識Java 配置

《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 {



}