首页 > 代码库 > Spring Security应用开发(02)基于XML配置的用户登录

Spring Security应用开发(02)基于XML配置的用户登录

1.1. 基于XML配置的登录功能

经过一系列配置之后,可以使用Spring Security内置功能实现最基本的用户登录功能以及角色验证功能,这种内置的功能没有任何实用价值,仅仅用于了解Spring Security的工作方式。

 

 

(1)配置web.xml

主要是为Spring MVCSpring Security提供一些入口,以便有机会进行Spring MVC以及Spring Security的初始化和过滤处理等工作。

 <servlet>

  <servlet-name>springmvc</servlet-name>

  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

  <init-param>

   <param-name>contextConfigLocation</param-name>

   <param-value>classpath:config/spring/springmvc.xml</param-value>

  </init-param>

  <load-on-startup>1</load-on-startup>

  </servlet>

  

  <servlet-mapping>

  <servlet-name>springmvc</servlet-name>

  <url-pattern>*.action</url-pattern>

  </servlet-mapping>

  

  

  <servlet-mapping>

  <servlet-name>springmvc</servlet-name>

  <url-pattern>/</url-pattern>

  </servlet-mapping>

  

  

  

  <filter>

  <filter-name>characterEncoding</filter-name>

  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

  </filter>

  

  <filter-mapping>

  <filter-name>characterEncoding</filter-name>

  <url-pattern>/*</url-pattern>

  </filter-mapping>

 

  

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

   <context-param>

  <param-name>contextConfigLocation</param-name>

  <param-value>/WEB-INF/classes/config/spring/spring_*.xml</param-value>

  </context-param>

  

  <listener>

  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

  </listener>

 

 

 

 

(2)Spring MVC的专用配置。

springmvc.xml中进行,本文主要专注于介绍Spring Security的使用,本文件的内容略去。

 

(3)Spring Security专用配置。

spring-security.xml中配置。

主要进行角色列表、用户列表以及用户和角色的对应关系,以及角色对资源的访问权限的配置。

http标签的说明如下:

http标签用于配置http认证和授权的一些选项。

几个典型属性说明如下:

auto-config: 是否自动配置spring security的一些内部对象的关系。

use-expressions: 是否使用spEL表达式,Spring Security4.2中,默认值为true

 

几个典型子标签说明如下:

intercept-url 标签用于设置URL模式的访问权限许可。

本文先定义了三个URL模式:

 /admin/ 需要ADMIN角色。

/user/   需要USER角色。

/home/  ADMIN角色或USER角色均可。

其它未匹配的URL模式,包括站点首页(/),默认无需登录即匿名用户可访问。

 

authentication-provider标签用于设置用户登录认证的数据来源。包括直接在此XML中定义用户名和密码、在数据库中定义用户名和密码和使用LDAP等三种方式。本文先使用最直观的第一种方式。

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

  xmlns:sec="http://www.springframework.org/schema/security"

  xsi:schemaLocation="

    http://www.springframework.org/schema/security

    http://www.springframework.org/schema/security/spring-security-4.2.xsd

    http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">

 

 

<!-- 角色和URL模式的对应关系 -->

 <sec:http auto-config="true" use-expressions="true">

 <sec:intercept-url pattern="/admin/**" access="hasRole(‘ROLE_ADMIN‘)" />

 <sec:intercept-url pattern="/user/**" access="hasRole(‘ROLE_USER‘)" />

 <sec:intercept-url pattern="/home/**" access="hasRole(‘ROLE_USER‘) or hasRole(‘ROLE_ADMIN‘)" />

 </sec:http>

 

 <!-- 用户和角色的对应关系 -->

 <sec:authentication-manager>

   <sec:authentication-provider>

     <sec:user-service>

      <sec:user name="zhangsan"  password="123456" authorities="ROLE_ADMIN"/>

      <sec:user name="wangwu"  password="123456" authorities="ROLE_USER"/>

     </sec:user-service>

   </sec:authentication-provider>

 </sec:authentication-manager>


</beans:beans>

 

 

 

(3)控制器编写。

 

本文针对三种不同的URL模式,设计了三个控制器。

@Controller

@RequestMapping("/admin")

public class AdminController {

 

@RequestMapping("/")

public ModelAndView  index(){

ModelAndView  mv = new ModelAndView();

mv.addObject("message", "hello,admin");

mv.setViewName("admin/index");

return mv;

}

}

 

@Controller

@RequestMapping("/user")

public class UserController {

 

@RequestMapping("/")

public ModelAndView  index(){

ModelAndView mv = new ModelAndView();

mv.addObject("message", "hello user");

mv.setViewName("user/index");

return mv;

}

}

@Controller

@RequestMapping("/home")

public class HomeController {

 

@RequestMapping("/")

public ModelAndView  index(){

ModelAndView  mv = new ModelAndView();

mv.addObject("message", "Hello,welcome!");

mv.setViewName("home/index");

return mv;

}

}

 

 

 

 

(4)JSP页面。

包括控制器所需要的三个jsp页面,共同的header.jsptail.jsp,以及站点首页index.jsp

为了节省篇幅,本部分内容略去。

 

(5)运行测试。

访问首页:

访问站点首页,发现可正常访问而无需登录。

 技术分享

 

 

访问http://localhost:8080/SpringSecurity/user/

发现已自动跳转到http://localhost:8080/SpringSecurity/login

需要登录:

 技术分享

 

输入在spring-security.xml中配置的具备USER角色的用户名wangwu和错误密码123后点击登录按钮,登录失败,出现登录失败画面。

 技术分享

输入正确的wangwu123456,则登录成功,自动跳转到导致用户登录的待访问页面:

 技术分享

 

至此,用户登录成功。

 

由于用户wangwu仅仅具备USER角色,而不具备ADMIN角色,此时访问admin页面时,则会出现决绝访问错误。

 技术分享

 

此时需要先退出登录。在首页设置了一个退出登录的按钮,退回到首页,点击log out按钮成功退出系统,并自动打开登录页面。

输入具备ADMIN角色的zhangsan用户的用户名和密码,成功登录后可正常访问admin页面

 技术分享

 

 

(6)登录表单

Spring Security自动产生了登录表单。

查看源代码如下:

<html><head><title>Login Page</title></head><body onload=‘document.f.username.focus();‘>

<h3>Login with Username and Password</h3><form name=‘f‘ action=‘/SpringSecurity/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 colspan=‘2‘><input name="submit" type="submit" value="Login"/></td></tr>

<input name="_csrf" type="hidden" value="3d036af1-d235-4146-8a48-528ab548c16c" />

</table>

</form></body></html>

 

 

主要是设置了Spring Security默认的登录提交地址为/login,以及默认的用户名和密码字段的字段名为usernamepassword,并添加了隐藏字段_csrf

 

(7)退出登录表单。

退出登录表单的页面代码编写如下:

 

<c:url var="logoutUrl" value="/logout"/>

<form  action="${logoutUrl}" method="post">

<input type="submit" value="Log out" />

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>

</form>

 

 

 

退出登录同样需要添加隐藏字段_csrf,否则会出现错误:

 技术分享

 

Spring Security应用开发(02)基于XML配置的用户登录