1. 程式人生 > >《Spring Security教程系列》三.HttpSecurity的使用

《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")//自定義密碼引數名稱