HttpSecurity
到目前爲止我們的 SecurityConfig 只包含了關於如何驗證我們的用戶的信息。Spring Security怎麼知道我們想對所有的用戶進行驗證?Spring Security怎麼知道我們需要支持基於表單的驗證?原因是我們的SecurityConfig類繼承的WebSecurityConfigurerAdapter在 configure(HttpSecurity http) 方法提供了一個默認的配置,看起來和下面類似:
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
上面的默認配置說明:
確保我們應用中的所有請求都需要用戶被認證
允許用戶進行基於表單的認證
允許用戶使用HTTP基本驗證進行認證
你可以看到這個配置和下面的XML命名配置相似:
<http>
<intercept-url pattern="/**" access="authenticated"/>
<form-login />
<http-basic />
</http>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
authorizeRequests(),formLogin()、httpBasic()這三個方法返回的分別是ExpressionUrlAuthorizationConfigurer、FormLoginConfigurer、HttpBasicConfigurer,他們都是SecurityConfigurer接口的實現類,分別代表的是不同類型的安全配置器。
總的來說:HttpSecurity是SecurityBuilder接口的一個實現類,從名字上我們就可以看出這是一個HTTP安全相關的構建器。當然我們在構建的時候可能需要一些配置,當我們調用HttpSecurity對象的方法時,實際上就是在進行配置。
配置的最終結果是什麼?
基本上每個SecurityConfigurer子類都對應一個或多個過濾器
可見ExpressionUrlAuthorizationConfigurer、FormLoginConfigurer、HttpBasicConfigurer三個配置器對應的Filter分別是FilterSecurityInterceptor、UsernamePasswordAuthenticationFilter、BasicAuthenticationFilter。
而HttpSecuirty內部維護了一個Filter的List集合,我們添加的各種安全配置器對應的Filter最終都會被加入到這個List集合中。
配置表單登錄
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage( "/login")// 1
.permitAll(); // 2
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
1、更新後的配置,指定了登錄頁面的位置
2、我們必須允許所有的用戶,不管是否登錄,都可以訪問這個頁面。 formLogin().permitAll()允許所有用戶訪問這個頁面。
可以自定義用戶名和密碼的參數名,但是無法修改POST方法請求/login這個URL
.formLogin()
.loginPage( "/login")
.usernameParameter("uname")//自定義用戶名參數名稱
.passwordParameter("pwd")//自定義密碼參數名稱