1. 程式人生 > >Spring Security入門(2-3)HttpSecurity的使用

Spring Security入門(2-3)HttpSecurity的使用

登錄 一個 最終 指定 ebs row pat ati 是我

到目前為止我們的 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")//自定義密碼參數名稱

Spring Security入門(2-3)HttpSecurity的使用