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

原文:www.baeldung.com/spring-secu…

作者:baeldung

译者:Leesen

Spring Security 表单登录的更多相关文章

  1. spring security 表单认证的流程

    spring security表单认证过程 表单认证过程 Spring security的表单认证过程是由org.springframework.security.web.authentication ...

  2. SpringBoot集成Spring Security(4)——自定义表单登录

    通过前面三篇文章,你应该大致了解了 Spring Security 的流程.你应该发现了,真正的 login 请求是由 Spring Security 帮我们处理的,那么我们如何实现自定义表单登录呢, ...

  3. spring security 之自定义表单登录源码跟踪

    ​ 上一节我们跟踪了security的默认登录页的源码,可以参考这里:https://www.cnblogs.com/process-h/p/15522267.html 这节我们来看看如何自定义单表认 ...

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

    概述 在本文中,我们将通过向标准登录表单添加额外字段来实现Spring Security的自定义身份验证方案. 我们将重点关注两种不同的方法,以展示框架的多功能性以及我们可以使用它的灵活方式. 我们的 ...

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

    SpringSecurity 默认表单登录页展示流程源码 本篇主要讲解 SpringSecurity提供的默认表单登录页 它是如何展示的的流程, 涉及 1.FilterSecurityIntercep ...

  6. SpringSecurity实战记录(一)开胃菜:基于内存的表单登录小Demo搭建

    Ps:本次搭建基于Maven管理工具的版本,Gradle版本可以通过gradle init --type pom命令在pom.xml路径下转化为Gradle版本(如下图) (1)构建工具IDEA In ...

  7. Spring Security 的注册登录流程

    Spring Security 的注册登录流程 数据库字段设计 主要数据库字段要有: 用户的 ID 用户名称 联系电话 登录密码(非明文) UserDTO对象 需要一个数据传输对象来将所有注册信息发送 ...

  8. spring security之 默认登录页源码跟踪

    spring security之 默认登录页源码跟踪 ​ 2021年的最后2个月,立个flag,要把Spring Security和Spring Security OAuth2的应用及主流程源码研究透 ...

  9. SpringSecurity 自定义表单登录

    SpringSecurity 自定义表单登录 本篇主要讲解 在SpringSecurity中 如何 自定义表单登录 , SpringSecurity默认提供了一个表单登录,但是实际项目里肯定无法使用的 ...

随机推荐

  1. 合理使用webpack提高开发效率

    虽然公司有提供现成的脚手架工具,但是作为开发人员懂得必要的相关知识还是很重要的.这样有利于提高我们的开发效率,优化我们的代码. 关于npm scripts 什么是npm scripts npm 允许在 ...

  2. 开发人员为组件添加自定义的className

    在开发过程当中需要给组件写上自己的样式,这个时候怎么办呢? 直接给组件添加className这样是无效的 当给组件添加className之后 在写组件的时候需要对使用你的组件的开发人员提供自定义cla ...

  3. DB迁移:从SQL Server 2005到MySQL

    一.工具选择 依工作需要进行老产品升级,其中一项重要工作就是将SQL Server数据库改为MySQL数据库,故而在对<各种主流 SQLServer 迁移到 MySQL 工具对比>文章学习 ...

  4. Scrapy笔记:使用scrapy shell url时出现403错误的解决办法

    参考 : http://www.th7.cn/Program/Python/201704/1154208.shtml 原因是网站的防爬虫配置起到了作用 (1):第一种方法是在命令上加上-s USER_ ...

  5. Eigen--简单的C++矩阵计算库

    晚上突然想写一段小C++程序,要用到矩阵求逆呀乘法呀之类的,所以找了一下有什么现成的可用的C++矩阵计算相关的库,发现有一大堆,在其中各种各样的配置,感觉比较麻烦.从方便性来说Eigen是最方便的了, ...

  6. HDU5877 Weak Pair

    题目链接 Weak Pair 题意十分明确, 就是求出符合题意的有序点对个数. 首先对ai离散,离散之后的结果用rk[i]表示,然后进行二分预处理得到f[i],其中f[i]的意义为:其他的点和i这个节 ...

  7. luogu P1345 [USACO5.4]奶牛的电信Telecowmunication

    https://www.luogu.org/problemnew/show/1345 拆点,中间建流量为1的边,跑最小割 #include<cstdio> #include<queu ...

  8. 解决 ultraedit 菜单字体模糊

    新装完ultraedit后,使用时菜单里的字体非常小,模糊不清非常不爽. 1.安装好UltraEdit后,到安装目录里,复制一份Uedit32.exe文件用于修改.2.使用UltraEdit打开复制的 ...

  9. python局部变量与全局变量

    name = "head first python"def what_happens_here():    print(name)  1    name = "pytho ...

  10. mac 配置sencha touch环境

    1 安装 java 2 安装 node js 为使用npm作准备 3 用npm命令安装 cordova npm install -g cordova