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

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 表单登录功能的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • Spring Security在标准登录表单中添加一个额外的字段

    概述 在本文中,我们将通过向标准登录表单添加额外字段来实现Spring Security的自定义身份验证方案. 我们将重点关注两种不同的方法,以展示框架的多功能性以及我们可以使用它的灵活方式. 我们的第一种方法是一个简单的解决方案,专注于重用现有的核心Spring Security实现. 我们的第二种方法是更加定制的解决方案,可能更适合高级用例. 2. Maven设置 我们将使用Spring Boot启动程序来引导我们的项目并引入所有必需的依赖项.  我们将使用的设置需要父声明,Web启动器和安

  • SpringBoot + SpringSecurity 短信验证码登录功能实现

    实现原理 在之前的文章中,我们介绍了普通的帐号密码登录的方式: SpringBoot + Spring Security 基本使用及个性化登录配置. 但是现在还有一种常见的方式,就是直接通过手机短信验证码登录,这里就需要自己来做一些额外的工作了. 对SpringSecurity认证流程详解有一定了解的都知道,在帐号密码认证的过程中,涉及到了以下几个类:UsernamePasswordAuthenticationFilter(用于请求参数获取),UsernamePasswordAuthentica

  • SpringSecurity认证流程详解

    SpringSecurity基本原理 在之前的文章<SpringBoot + Spring Security 基本使用及个性化登录配置>中对SpringSecurity进行了简单的使用介绍,基本上都是对于接口的介绍以及功能的实现. 这一篇文章尝试从源码的角度来上对用户认证流程做一个简单的分析. 在具体分析之前,我们可以先看看SpringSecurity的大概原理: SpringSecurity基本原理 其实比较简单,主要是通过一系列的Filter对请求进行拦截处理. 认证处理流程说明 我们直接

  • 详解spring security之httpSecurity使用示例

    httpSecurity 类似于spring security的xml配置文件命名空间配置中的<http>元素.它允许对特定的http请求基于安全考虑进行配置.默认情况下,适用于所有的请求,但可以使用requestMatcher(RequestMatcher)或者其它相似的方法进行限制. 使用示例: 最基本的基于表单的配置如下.该配置将所有的url访问权限设定为角色名称为"ROLE_USER".同时也定义了内存认证模式:使用用户名"user"和密码&qu

  • Spring Boot整合Spring Security简单实现登入登出从零搭建教程

    前言 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作. 本文主要给大家介绍了关于Spring Boot整合S

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

    1.简介 本文将重点介绍使用 Spring Security 登录. 本文将构建在之前简单的 Spring MVC示例 之上,因为这是设置Web应用程序和登录机制的必不可少的. 2. Maven 依赖 要将Maven依赖项添加到项目中,请参阅Spring Security with Maven 一文. 标准的 spring-security-web 和 spring-security-config 都是必需的. 3. Spring Security Java配置 我们首先创建一个扩展 WebSe

  • Spring Security实现验证码登录功能

    这篇文章主要介绍了Spring Security实现验证码登录功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在spring security实现登录注销功能的基础上进行开发. 1.添加生成验证码的控制器. (1).生成验证码 /** * 引入 Security 配置属性类 */ @Autowired private SecurityProperties securityProperties; @Override public ImageC

  • Spring Security使用单点登录的权限功能

    目录 背景 Spring Security 实现 已经有了单点登录页面,Spring Security怎么登录,不登录可以拿到权限吗 Authentication 继续分析 结论 如何手动登录Spring Security 结论 总结 附 参考 背景 在配置中心增加权限功能 目前配置中心已经包含了单点登录功能,可以通过统一页面进行登录,登录完会将用户写入用户表 RBAC的用户.角色.权限表CRUD.授权等都已经完成 希望不用用户再次登录,就可以使用SpringSecurity的权限控制 Spri

  • vue项目实现表单登录页保存账号和密码到cookie功能

    实现功能: 1.一周内自动登录勾选时,将账号和密码保存到cookie,下次登陆自动显示到表单内 2.点击忘记密码则清空之前保存到cookie的值,下次登陆需要手动输入 次要的就不说了直接上主要的代码 html部分 <el-form :model="ruleForm" :rules="rules" ref="ruleForm" class="demo-ruleForm loginFrom"> <h1 style

  • 详解Spring Security的formLogin登录认证模式

    一.formLogin的应用场景 在本专栏之前的文章中,已经给大家介绍过Spring Security的HttpBasic模式,该模式比较简单,只是进行了通过携带Http的Header进行简单的登录验证,而且没有定制的登录页面,所以使用场景比较窄. 对于一个完整的应用系统,与登录验证相关的页面都是高度定制化的,非常美观而且提供多种登录方式.这就需要Spring Security支持我们自己定制登录页面,也就是本文给大家介绍的formLogin模式登录认证模式. 准备工作 新建一个Spring B

  • SpringSecurity 默认表单登录页展示流程源码

    SpringSecurity 默认表单登录页展示流程源码 本篇主要讲解 SpringSecurity提供的默认表单登录页 它是如何展示的的流程, 涉及 1.FilterSecurityInterceptor, 2.ExceptionTranslationFilc,xmccmc,ter , 3.DefaultLoginPageGeneratingFilter 过滤器, 并且简单介绍了 AccessDecisionManager 投票机制  1.准备工作(体验SpringSecurity默认表单认证

  • Spring Security 实现“记住我”功能及原理解析

    这章继续扩展功能,来一个"记住我"的功能实现,就是说用户在登录一次以后,系统会记住这个用户一段时间,这段时间内用户不需要重新登录就可以使用系统. 记住我功能基本原理 原理说明 用户登录发送认证请求的时候会被UsernamePasswordAuthenticationFilter认证拦截,认证成功以后会调用一个RememberMeService服务,服务里面有一个TokenRepository,这个服务会生成一个Token,然后将Token写入到浏览器的Cookie同时会使用TokenR

  • Spring Security基于json登录实现过程详解

    主要是重写attemptAuthentication方法 导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot&l

  • SpringBoot基于SpringSecurity表单登录和权限验证的示例

    一.简介 上篇介绍了一个自己做的管理系统,最近空闲的时间自己在继续做,把之前登录时候自定义的拦截器过滤器换成了基于SpringSecurity来做,其中遇到了很多坑,总结下,大家有遇到类似问题的话就当是为大家闭坑吧. 二.项目实现功能和成果展示 首先来看下登录界面:这是我输入的一个正确的信息,点击登录后SpringSecurity会根据你输入的用户名和密码去验证是否正确,如果正确的话就去你定义的页面,我这里定义的是查询教师信息页面.来看下代码吧. 三.准备工作(前台页面.实体类) 实体类Teac

随机推荐