前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Security 表单登录

Spring Security 表单登录

作者头像
乱敲代码
发布2019-06-26 23:20:47
1.6K0
发布2019-06-26 23:20:47
举报
文章被收录于专栏:Java系列文章Java系列文章

1. 简介

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

2. Maven 依赖

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

3. Spring Security Java配置

我们首先创建一个扩展 WebSecurityConfigurerAdapterSpringSecurity配置类。 通过添加 @EnableWebSecurity,我们获得了Spring Security和MVC集成支持:

代码语言:javascript
复制
@Configuration@EnableWebSecuritypublic 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:

代码语言:javascript
复制
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配置文件:

代码语言:javascript
复制
@Configuration@ImportResource({ "classpath:webSecurityConfig.xml" })public class SecSecurityConfig {   public SecSecurityConfig() {      super();   }}

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

代码语言:javascript
复制
<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 - 只有一个额外的过滤器添加到 SpringMVC 的web.xml中:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
registry.addViewController("/login.html");

对应于login.jsp:

代码语言:javascript
复制
<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元素如下所示:

代码语言:javascript
复制
@Overrideprotected void configure(HttpSecurity http) throws Exception {    http.formLogin()      .loginPage("/login.html")      .loginProcessingUrl("/perform_login")      .defaultSuccessUrl("/homepage.html",true)      .failureUrl("/login.html?error=true")}

或者相应的XML配置:

代码语言:javascript
复制
<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()方法配置自定义登录页面:

代码语言:javascript
复制
http.formLogin()  .loginPage("/login.html")

或者,使用XML配置:

代码语言:javascript
复制
login-page='/login.html'

如果我们不指定这个,Spring Security将在/login上生成一个非常基本的登录表单。

8.2. 登录的POST URL

触发身份验证默认的URL是/login,我们可以使用loginProcessingUrl方法来覆盖此URL:

代码语言:javascript
复制
http.formLogin()  .loginProcessingUrl("/perform_login")

或者,使用XML配置:

代码语言:javascript
复制
login-processing-url="/perform_login"

覆盖此默认URL的一个很好的理由是:隐藏应用程序受 SpringSecurity保护的事实 - 该信息不应在外部提供。

8.3. 登录成功页面

成功登录过程后,用户将被重定向到页面 - 默认情况下,该页面是Web应用程序的根目录。

我们可以通过defaultSuccessUrl()方法覆盖它:

代码语言:javascript
复制
http.formLogin()  .defaultSuccessUrl("/homepage.html")

或者,使用XML配置:

代码语言:javascript
复制
default-target-url="/homepage.html"

如果always-use-default-target设置为 true,则用户始终会重定向到此页面。 如果该属性设置为 false,则在提示进行身份验证之前,用户将被重定向到他们想要访问的上一页。

8.4. 登录失败页面

与登录页面相同,默认情况下, SpringSecurity会在/login?error自动生成登录失败页面。

要覆盖它,我们可以使用failureUrl()方法:

代码语言:javascript
复制
http.formLogin()  .failureUrl("/login.html?error=true")

或者XML:

代码语言:javascript
复制
authentication-failure-url="/login.html?error=true"

9. 结论

在这个Spring登录示例中,我们配置了一个简单的身份验证过程 - 我们讨论了Spring安全登录表单,安全配置和一些可用的更高级的自定义。

这个Spring登录教程的实现可以在GitHub项目中找到 - 这是一个基于Eclipse的项目,所以它应该很容易导入和运行。

当项目在本地运行时,可以在以下位置访问示例HTML:

代码语言:javascript
复制
http://localhost:8080/spring-security-mvc-login/login.html

原文:https://www.baeldung.com/spring-security-login 作者:baeldung 译者:Leesen

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 乱敲代码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 简介
  • 2. Maven 依赖
  • 3. Spring Security Java配置
    • 3.1. authorizeRequests()
      • 3.2. formLogin()
        • 3.3. Authentication Manager
        • 4. 添加Spring Security到Web应用
        • 5. Spring Security XML配置
        • 6. web.xml
        • 7. Login Form
        • 8.进一步配置Spring登录
          • 8.1. 登录页
            • 8.2. 登录的POST URL
              • 8.3. 登录成功页面
                • 8.4. 登录失败页面
                • 9. 结论
                相关产品与服务
                多因子身份认证
                多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档