《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();

}
  • 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")//自定義密碼參數名稱
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章