使用Spring Secury开发安全的MVC应用程序 - 表单登录示例

Tags: java spring

1. 介绍

这篇文章着重介绍使用Spring Security登陆。这篇文章基于Spring MVC 教程中的内容,它是建立具备登陆功能web应用程序的一个必要部分。

2. Maven依赖

参考如何在Maven中配置Spring依赖这篇文章向项目增加Maven依赖。标准的spring-security-webspring-security-config都是需要的。

3. web.xml

web.xml中Spring Security的配置很简单,仅仅增加一个二外的过滤器到web.xml中即可:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   xsi:schemaLocation="
      http://java.sun.com/xml/ns/javaee
      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id="WebApp_ID" version="3.0">

   <display-name>Spring Secured Application</display-name>

   <!-- Spring MVC -->
   <servlet>
      <servlet-name>mvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
   </servlet>
   <servlet-mapping>
      <servlet-name>mvc</servlet-name>
      <url-pattern>/</url-pattern>
   </servlet-mapping>

   <context-param>
      <param-name>contextClass</param-name>
      <param-value>
         org.springframework.web.context.support.AnnotationConfigWebApplicationContext
      </param-value>
   </context-param>
   <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>org.baeldung.spring.web.config</param-value>
   </context-param>
   <listener>
      <listener-class>
         org.springframework.web.context.ContextLoaderListener
      </listener-class>
   </listener>

   <!-- 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>

</web-app>

DelegatingFilterProxy过滤器仅仅委托到一个Spring管理的bean,FilterChainProxy受益于Spring的bean生命周期管理。

4. Spring Security配置

大部分Spring配置可以使用Java注解方式进行配置,但是Spring Security配置目前还不完全支持Java注解方式进行配置,任然需要在XML配置文件中完成大部分配置。Spring团队正在添加Spring Security基于Java注解的配置功能,但目前还不成熟。

由于整个项目使用Java注解配置,所以XML配置文件需要通过Java的@Configuration注解类导入:

@Configuration
@ImportResource({ "classpath:webSecurityConfig.xml" })
public class SecSecurityConfig {
   public SecSecurityConfig() {
      super();
   }
}

下面是Spring Security的XML配置文件webSecurityConfig.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:beans="http://www.springframework.org/schema/beans"
  xsi:schemaLocation="
      http://www.springframework.org/schema/security
      http://www.springframework.org/schema/security/spring-security-3.2.xsd
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">

   <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>
      </authentication-provider>
   </authentication-manager>
</beans:beans>

4.1 <intercept-url>

我们允许匿名用户访问/login页面这样用户可以通过这个页面填写认证信息,此外的其他页面均需要认证才可以访问

注意<intercept-url>的顺序很重要,比较具体的规则需要放在前面,后面则放置相对通用的规则。

4.2 <form-login>

  • login-page:自定义的登录界面

  • default-target-url: 登录成功后跳转的页面

  • authentication-failure-url: 登录失败后跳转的页面

4.3 <authentication-manager>

身份验证提供程序是通过一个简单的、 内存中实现的类-- InMemoryUserDetailsManager可以在配置文件中配置。这只在Spring 3.1及以上版本中可用,它适合在快速原型时使用(这时候不需要使用更复杂的持久化机制)。

5. 登录表单

登录表单页面直接使用Spring MVC的视图配置方法即可,这里无需配置控制器:

registry.addViewController("/login.html");

下面是login.jsp的内容:

<html>
<head></head>
<body>
   <h1>Login</h1>
   <form name='f' action="j_spring_security_check" method='POST'>
      <table>
         <tr>
            <td>User:</td>
            <td><input type='text' name='j_username' value=''></td>
         </tr>
         <tr>
            <td>Password:</td>
            <td><input type='password' name='j_password' /></td>
         </tr>
         <tr>
            <td><input name="submit" type="submit" value="submit" /></td>
         </tr>
      </table>
  </form>
</body>

登录页面有以下组件:

  • j_spring_security_check:登录提交的地址,用户执行鉴权过程。

  • j_username:用户名

  • j_password: 密码

6. 进一步配置Spring登录

在上面的内容中,我们简要地讨论了几个配置的登录机制的方法, 现在让我们进入一些细节。

覆盖Spring Security中大部分默认配置的目的是:尽可能减少攻击者对应用程序信息的了解,使其不清楚应用程序是由Spring Security进行保护的。

配置完成的如下:

<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"/>

6.1 登录页面

登录页面使用元素的login-page属性配置:

login-page='/login.html'

如果这个属性没有配置,那么会使用默认的url: sprint_security_login。Spring Security会生成默认的非常简单的登录页面。

6.2 登录提交URL

Spring Security默认的登录验证URL是/j_spring_security_check。这个地址可以通过修改元素的login-processing-url进行调整。

login-processing-url="/perform_login"

修改这个配置的目的是隐藏当前应用程序是由Spring Security进行保护的信息,这个信息最好不要暴露。

6.3 登录成功页面

登录成功后,页面会跳转到登录成功页面,默认的页面是应用的主页。这个可以通过修改的default-target-url进行调整。

default-target-url="/homepage.html"

如果always-use-default-target被设置为true时,用户登录成功后页面始终会跳转到配置的页面,否则会跳转到登录前的页面。

6.4 登录失败页面

与登录成功页面相同,登录失败后Spring Security会自动生成登录失败页面,默认是/spring_security_login?login_error,可以通过修改元素的authentication-failure-url 进行调整。

authentication-failure-url="/login.html?error=true"

7. 结论

在这篇教程中我们配置了简单的Spring Security认证过程,我们讨论了Spring Security登录表单、Security的XML配置文件以及一些高级配置。

这篇教程的源代码可以通过GitHub获取到,源代码是Eclipse工程,所以很容易被导入和执行。

当项目被导入和执行后,示例页面可以通过以下地址访问到:

http://localhost:8080/spring-security-login/login.html

来源:Spring Security Form Login
翻译:4byte.cn

本文链接:http://www.4byte.cn/learning/119967/shi-yong-spring-secury-kai-fa-an-quan-de-mvc-ying-yong-cheng-xu-biao-dan-deng-lu-shi-li.html