Spring Security 表單登陸

1. 簡介

本文將重點介紹使用Spring Security登陸。 本文將構建在以前簡單的Spring MVC示例之上,由於這是設置Web應用程序和登陸機制的必不可少的。html

2. Maven 依賴

要將Maven依賴項添加到項目中,請參閱Spring Security with Maven一文。 標準的spring-security-webspring-security-config都是必需的。java

3. Spring Security Java配置

咱們首先建立一個擴展WebSecurityConfigurerAdapterSpring Security配置類。 經過添加@EnableWebSecurity,咱們得到了Spring Security和MVC集成支持:git

@Configuration @EnableWebSecurity public class SecSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(final AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user1").password(passwordEncoder().encode("user1Pass")).roles("USER") .and() .withUser("user2").password(passwordEncoder().encode("user2Pass")).roles("USER") .and() .withUser("admin").password(passwordEncoder().encode("adminPass")).roles("ADMIN"); } @Override protected void configure(final HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/anonymous*").anonymous() .antMatchers("/login*").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login.html") .loginProcessingUrl("/perform_login") .defaultSuccessUrl("/homepage.html", true) //.failureUrl("/login.html?error=true") .failureHandler(authenticationFailureHandler()) .and() .logout() .logoutUrl("/perform_logout") .deleteCookies("JSESSIONID") .logoutSuccessHandler(logoutSuccessHandler()); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } } 

在此示例中,咱們使用內存身份驗證並定義了3個用戶。github

如今來看看咱們用來建立表單登陸配置的元素。web

3.1. authorizeRequests()

咱們容許匿名訪問*/login*,以便用戶能夠進行身份驗證,同時也是保護其餘請求。請注意,*antMatchers()*元素的順序很重要 - 首先須要填寫具體的路徑規則,而後是纔是大體匹配的規則。spring

3.2. formLogin()

這有幾種方法能夠用來配置表單登陸的行爲:express

  • loginPage() – 自定義登陸頁面
  • loginProcessingUrl() – 提交username和password的URL
  • defaultSuccessUrl() – 登陸成功後跳轉的URL
  • failureUrl() – 登陸失敗後跳轉的URL

3.3. Authentication Manager

身份驗證提供程序由一個簡單的內存實現支持 - InMemoryUserDetailsManager。 當尚不須要完整的持久性機制時,這對於進行快速原型設計頗有用。spring-mvc

從Spring 5開始,咱們還必須定義密碼編碼器。 在咱們的例子中,咱們使用了BCryptPasswordEncoder安全

4. 添加Spring Security到Web應用

要使用上面定義的Spring Security配置,咱們須要將其添加到Web應用程序。 在這種狀況下,咱們不須要任何web.xmlmvc

public class SpringApplicationInitializer   extends AbstractAnnotationConfigDispatcherServletInitializer {         protected Class<?>[] getRootConfigClasses() {         return new Class[] {SecSecurityConfig.class};     } } 

注意,若是咱們使用Spring Boot應用程序,則不須要此初始化程序。 有關如何在Spring Boot中加載安全性配置的更多詳細信息,詳情參閱Spring Boot security auto-configuration

5. Spring Security XML配置

咱們來看看相應的XML配置。整個項目使用Java配置,所以咱們須要經過Java @Configuration類導入XML配置文件:

@Configuration @ImportResource({ "classpath:webSecurityConfig.xml" }) public class SecSecurityConfig {    public SecSecurityConfig() {       super();    } } 

以及Spring Security 的XML配置– webSecurityConfig.xml:

<http use-expressions="true">     <intercept-url pattern="/login*" access="isAnonymous()" />     <intercept-url pattern="/**" access="isAuthenticated()"/>       <form-login login-page='/login.html'       default-target-url="/homepage.html"       authentication-failure-url="/login.html?error=true" />     <logout logout-success-url="/login.html" /> </http>   <authentication-manager>     <authentication-provider>         <user-service>             <user name="user1" password="user1Pass" authorities="ROLE_USER" />         </user-service>         <password-encoder ref="encoder" />     </authentication-provider> </authentication-manager>   <beans:bean id="encoder"   class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"> </beans:bean> 

6. web.xml

在引入Spring 4以前,咱們曾經在web.xml中配置Spring Security - 只有一個額外的過濾器添加到Spring MVC 的web.xml中:

<display-name>Spring Secured Application</display-name>   <!-- Spring MVC --> <!-- ... -->   <!-- Spring Security --> <filter>     <filter-name>springSecurityFilterChain</filter-name>     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping>     <filter-name>springSecurityFilterChain</filter-name>     <url-pattern>/*</url-pattern> </filter-mapping> 

過濾器 - DelegatingFilterProxy - 簡單地委託給一個Spring管理的bean - FilterChainProxy-它自己能夠從完整的Spring bean生命週期管理中受益。

7. Login Form

登陸表單頁面使用簡單的機制將視圖名稱映射到URL向Spring MVC註冊,且無需編寫Controller:

registry.addViewController("/login.html"); 

對應於login.jsp

<html> <head></head> <body>    <h1>Login</h1>    <form name='f' action="login" method='POST'>       <table>          <tr>             <td>User:</td>             <td><input type='text' name='username' value=''></td>          </tr>          <tr>             <td>Password:</td>             <td><input type='password' name='password' /></td>          </tr>          <tr>             <td><input name="submit" type="submit" value="submit" /></td>          </tr>       </table>   </form> </body> </html> 
  • Spring Login form包含如下相關組件:
    • login - 接受表單POST的URL,觸發身份驗證過程
    • username - 用戶名
    • password - 密碼

8.進一步配置Spring登陸

當咱們在上面介紹Spring安全配置時,咱們簡要討論了一些登陸機制的配置 - 如今詳細介紹一下。

覆蓋Spring Security中大多數默認值的一個緣由是隱藏應用程序受Spring Security保護的事實,並最大限度地減小潛在攻擊者對應用程序的瞭解。

徹底配置後,login元素以下所示:

@Override protected void configure(HttpSecurity http) throws Exception {     http.formLogin()       .loginPage("/login.html")       .loginProcessingUrl("/perform_login")       .defaultSuccessUrl("/homepage.html",true)       .failureUrl("/login.html?error=true") } 

或者相應的XML配置:

<form-login   login-page='/login.html'   login-processing-url="/perform_login"   default-target-url="/homepage.html"   authentication-failure-url="/login.html?error=true"   always-use-default-target="true"/> 

8.1. 登陸頁

接下來,讓咱們看看如何使用*loginPage()*方法配置自定義登陸頁面:

http.formLogin()
  .loginPage("/login.html") 

或者,使用XML配置:

login-page='/login.html'

若是咱們不指定這個,Spring Security將在*/login*上生成一個很是基本的登陸表單。

8.2. 登陸的POST URL

觸發身份驗證默認的URL是*/login*,咱們可使用loginProcessingUrl方法來覆蓋此URL:

http.formLogin()
  .loginProcessingUrl("/perform_login") 

或者,使用XML配置:

login-processing-url="/perform_login"

覆蓋此默認URL的一個很好的理由是:隱藏應用程序受Spring Security保護的事實 - 該信息不該在外部提供。

8.3. 登陸成功頁面

成功登陸過程後,用戶將被重定向到頁面 - 默認狀況下,該頁面是Web應用程序的根目錄。

咱們能夠經過*defaultSuccessUrl()*方法覆蓋它:

http.formLogin()
  .defaultSuccessUrl("/homepage.html") 

或者,使用XML配置:

default-target-url="/homepage.html"

若是always-use-default-target設置爲true,則用戶始終會重定向到此頁面。 若是該屬性設置爲false,則在提示進行身份驗證以前,用戶將被重定向到他們想要訪問的上一頁。

8.4. 登陸失敗頁面

與登陸頁面相同,默認狀況下,Spring Security會在*/login?error*自動生成登陸失敗頁面。

要覆蓋它,咱們可使用*failureUrl()*方法:

http.formLogin()
  .failureUrl("/login.html?error=true") 

或者XML:

authentication-failure-url="/login.html?error=true"

9. 結論

在這個Spring登陸示例中,咱們配置了一個簡單的身份驗證過程 - 咱們討論了Spring安全登陸表單,安全配置和一些可用的更高級的自定義。

這個Spring登陸教程的實現能夠在GitHub項目中找到 - 這是一個基於Eclipse的項目,因此它應該很容易導入和運行。

當項目在本地運行時,能夠在如下位置訪問示例HTML:

http://localhost:8080/spring-security-mvc-login/login.html

原文:www.baeldung.com/spring-secu…

做者:baeldung

譯者:Leesen

 

相關文章
相關標籤/搜索