点击左上角蓝字,关注“锅外的大佬”
专注分享国外最新技术内容

1. 简介

本文将重点介绍使用 SpringSecurity登录。 本文将构建在之前简单的Spring MVC示例之上,因为这是设置Web应用程序和登录机制的必不可少的。

2. Maven 依赖

要将Maven依赖项添加到项目中,请参阅Spring Security with Maven一文。 标准的 spring-security-web和 spring-security-config都是必需的。

3. Spring Security Java配置

我们首先创建一个扩展 WebSecurityConfigurerAdapter的 SpringSecurity配置类。 通过添加 @EnableWebSecurity,我们获得了Spring Security和MVC集成支持:
  1. @Configuration
  2. @EnableWebSecurity
  3. publicclassSecSecurityConfigextendsWebSecurityConfigurerAdapter{
  4. @Override
  5. protectedvoid configure(finalAuthenticationManagerBuilder auth)throwsException{
  6. auth.inMemoryAuthentication()
  7. .withUser("user1").password(passwordEncoder().encode("user1Pass")).roles("USER")
  8. .and()
  9. .withUser("user2").password(passwordEncoder().encode("user2Pass")).roles("USER")
  10. .and()
  11. .withUser("admin").password(passwordEncoder().encode("adminPass")).roles("ADMIN");
  12. }
  13. @Override
  14. protectedvoid configure(finalHttpSecurity http)throwsException{
  15. http
  16. .csrf().disable()
  17. .authorizeRequests()
  18. .antMatchers("/admin/**").hasRole("ADMIN")
  19. .antMatchers("/anonymous*").anonymous()
  20. .antMatchers("/login*").permitAll()
  21. .anyRequest().authenticated()
  22. .and()
  23. .formLogin()
  24. .loginPage("/login.html")
  25. .loginProcessingUrl("/perform_login")
  26. .defaultSuccessUrl("/homepage.html",true)
  27. //.failureUrl("/login.html?error=true")
  28. .failureHandler(authenticationFailureHandler())
  29. .and()
  30. .logout()
  31. .logoutUrl("/perform_logout")
  32. .deleteCookies("JSESSIONID")
  33. .logoutSuccessHandler(logoutSuccessHandler());
  34. }
  35. @Bean
  36. publicPasswordEncoder passwordEncoder(){
  37. returnnewBCryptPasswordEncoder();
  38. }
  39. }
在此示例中,我们使用内存身份验证并定义了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
  1. publicclassSpringApplicationInitializer
  2. extendsAbstractAnnotationConfigDispatcherServletInitializer{
  3. protectedClass<?>[] getRootConfigClasses(){
  4. returnnewClass[]{SecSecurityConfig.class};
  5. }
  6. }
注意,如果我们使用Spring Boot应用程序,则不需要此初始化程序。 有关如何在Spring Boot中加载安全性配置的更多详细信息,详情参阅Spring Boot security auto-configuration

5. Spring Security XML配置

我们来看看相应的XML配置。整个项目使用Java配置,因此我们需要通过Java @Configuration类导入XML配置文件:
  1. @Configuration
  2. @ImportResource({"classpath:webSecurityConfig.xml"})
  3. publicclassSecSecurityConfig{
  4. publicSecSecurityConfig(){
  5. super();
  6. }
  7. }
以及Spring Security 的XML配置– webSecurityConfig.xml:
  1. <httpuse-expressions="true">
  2. <intercept-urlpattern="/login*"access="isAnonymous()"/>
  3. <intercept-urlpattern="/**"access="isAuthenticated()"/>
  4. <form-loginlogin-page='/login.html'
  5. default-target-url="/homepage.html"
  6. authentication-failure-url="/login.html?error=true"/>
  7. <logoutlogout-success-url="/login.html"/>
  8. </http>
  9. <authentication-manager>
  10. <authentication-provider>
  11. <user-service>
  12. <username="user1"password="user1Pass"authorities="ROLE_USER"/>
  13. </user-service>
  14. <password-encoderref="encoder"/>
  15. </authentication-provider>
  16. </authentication-manager>
  17. <beans:beanid="encoder"
  18. class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
  19. </beans:bean>

6. web.xml

在引入Spring 4之前,我们曾经在 web.xml中配置Spring Security - 只有一个额外的过滤器添加到 SpringMVC 的web.xml中:
  1. <display-name>Spring Secured Application</display-name>
  2. <!-- Spring MVC -->
  3. <!-- ... -->
  4. <!-- Spring Security -->
  5. <filter>
  6. <filter-name>springSecurityFilterChain</filter-name>
  7. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  8. </filter>
  9. <filter-mapping>
  10. <filter-name>springSecurityFilterChain</filter-name>
  11. <url-pattern>/*</url-pattern>
  12. </filter-mapping>
过滤器 - DelegatingFilterProxy - 简单地委托给一个Spring管理的bean - FilterChainProxy-它本身可以从完整的Spring bean生命周期管理中受益。

7. Login Form

登录表单页面使用简单的机制将视图名称映射到URL向Spring MVC注册,且无需编写Controller:
  1. registry.addViewController("/login.html");
对应于login.jsp
  1. <html>
  2. <head></head>
  3. <body>
  4. <h1>Login</h1>
  5. <formname='f'action="login"method='POST'>
  6. <table>
  7. <tr>
  8. <td>User:</td>
  9. <td><inputtype='text'name='username'value=''></td>
  10. </tr>
  11. <tr>
  12. <td>Password:</td>
  13. <td><inputtype='password'name='password'/></td>
  14. </tr>
  15. <tr>
  16. <td><inputname="submit"type="submit"value="submit"/></td>
  17. </tr>
  18. </table>
  19. </form>
  20. </body>
  21. </html>
  • Spring Login form包含以下相关组件:
  • login - 接受表单POST的URL,触发身份验证过程
  • username - 用户名
  • password - 密码

8.进一步配置Spring登录

当我们在上面介绍Spring安全配置时,我们简要讨论了一些登录机制的配置 - 现在详细介绍一下。
覆盖Spring Security中大多数默认值的一个原因是隐藏应用程序受Spring Security保护的事实,并最大限度地减少潜在攻击者对应用程序的了解。
完全配置后,login元素如下所示:
  1. @Override
  2. protectedvoid configure(HttpSecurity http)throwsException{
  3.     http.formLogin()
  4. .loginPage("/login.html")
  5. .loginProcessingUrl("/perform_login")
  6. .defaultSuccessUrl("/homepage.html",true)
  7. .failureUrl("/login.html?error=true")
  8. }
或者相应的XML配置:
  1. <form-login
  2. login-page='/login.html'
  3. login-processing-url="/perform_login"
  4. default-target-url="/homepage.html"
  5. authentication-failure-url="/login.html?error=true"
  6. always-use-default-target="true"/>

8.1. 登录页

接下来,让我们看看如何使用loginPage()方法配置自定义登录页面:
  1. http.formLogin()
  2. .loginPage("/login.html")
或者,使用XML配置:
  1. login-page='/login.html'
如果我们不指定这个,Spring Security将在/login上生成一个非常基本的登录表单。

8.2. 登录的POST URL

触发身份验证默认的URL是/login,我们可以使用loginProcessingUrl方法来覆盖此URL:
  1. http.formLogin()
  2. .loginProcessingUrl("/perform_login")
或者,使用XML配置:
  1. login-processing-url="/perform_login"
覆盖此默认URL的一个很好的理由是:隐藏应用程序受 SpringSecurity保护的事实 - 该信息不应在外部提供。

8.3. 登录成功页面

成功登录过程后,用户将被重定向到页面 - 默认情况下,该页面是Web应用程序的根目录。
我们可以通过defaultSuccessUrl()方法覆盖它:
  1. http.formLogin()
  2. .defaultSuccessUrl("/homepage.html")
或者,使用XML配置:
  1. default-target-url="/homepage.html"
如果always-use-default-target设置为 true,则用户始终会重定向到此页面。 如果该属性设置为 false,则在提示进行身份验证之前,用户将被重定向到他们想要访问的上一页。

8.4. 登录失败页面

与登录页面相同,默认情况下, SpringSecurity会在/login?error自动生成登录失败页面。
要覆盖它,我们可以使用failureUrl()方法:
  1. http.formLogin()
  2. .failureUrl("/login.html?error=true")
或者XML:
  1. authentication-failure-url="/login.html?error=true"

9. 结论

在这个Spring登录示例中,我们配置了一个简单的身份验证过程 - 我们讨论了Spring安全登录表单,安全配置和一些可用的更高级的自定义。
这个Spring登录教程的实现可以在GitHub项目中找到 - 这是一个基于Eclipse的项目,所以它应该很容易导入和运行。
当项目在本地运行时,可以在以下位置访问示例HTML:
  1. http://localhost:8080/spring-security-mvc-login/login.html
原文:https://www.baeldung.com/spring-security-login
作者:baeldung 
译者:Leesen
推荐阅读:
上篇好文:

文章对你是否有帮助呢?
别忘记右上角按钮分享给更多人哦
~



点击在看,和我一起帮助更多开发者!
继续阅读
阅读原文