《Spring Security教程系列》三.HttpSecurity的使用
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();
}
上面的預設配置說明:
確保我們應用中的所有請求都需要使用者被認證
允許使用者進行基於表單的認證
允許使用者使用HTTP基本驗證進行認證
你可以看到這個配置和下面的XML命名配置相似:
<http>
<intercept-url pattern="/**" access="authenticated" />
<form-login />
<http-basic />
</http>
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、我們必須允許所有的使用者,不管是否登入,都可以訪問這個頁面。 formLogin().permitAll()允許所有使用者訪問這個頁面。
可以自定義使用者名稱和密碼的引數名,但是無法修改POST方法請求/login這個URL
.formLogin()
.loginPage( "/login")
.usernameParameter("uname")//自定義使用者名稱引數名稱
.passwordParameter("pwd")//自定義密碼引數名稱