Spring Security 表單登錄


1. 簡介

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

2. Maven 依賴

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

3. Spring Security Java配置

我們首先創建一個擴展WebSecurityConfigurerAdapterSpring Security配置類。 通過添加@EnableWebSecurity,我們獲得了Spring Security和MVC集成支持:

@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個用戶。

現在來看看我們用來創建表單登錄配置的元素。

3.1. authorizeRequests()

我們允許匿名訪問*/login*,以便用戶可以進行身份驗證,同時也是保護其他請求。請注意,*antMatchers()*元素的順序很重要 - 首先需要填寫具體的路徑規則,然后是才是大致匹配的規則。

3.2. formLogin()

這有幾種方法可以用來配置表單登錄的行為:

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

3.3. Authentication Manager

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

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

4. 添加Spring Security到Web應用

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM