当前位置 : 主页 > 编程语言 > java >

Spring Security 表单登录功能的实现方法

来源:互联网 收集:自由互联 发布时间:2021-05-13
1.简介 本文将重点介绍使用 Spring Security 登录。 本文将构建在之前简单的 Spring MVC示例 之上,因为这是设置Web应用程序和登录机制的必不可少的。 2. Maven 依赖 要将Maven依赖项添加到项目

1.简介

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

2. Maven 依赖

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

3. Spring Security Java配置

我们首先创建一个扩展 WebSecurityConfigurerAdapter 的 Spring 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

总结

以上所述是小编给大家介绍的Spring Security 表单登录功能的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对自由互联网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

网友评论