首页 > 代码库 > Spring Security应用开发(02)基于XML配置的用户登录
Spring Security应用开发(02)基于XML配置的用户登录
1.1. 基于XML配置的登录功能
经过一系列配置之后,可以使用Spring Security内置功能实现最基本的用户登录功能以及角色验证功能,这种内置的功能没有任何实用价值,仅仅用于了解Spring Security的工作方式。
(1)配置web.xml。
主要是为Spring MVC和Spring 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.jsp和tail.jsp,以及站点首页index.jsp。
为了节省篇幅,本部分内容略去。
(5)运行测试。
访问首页:
访问站点首页,发现可正常访问而无需登录。
访问http://localhost:8080/SpringSecurity/user/
发现已自动跳转到http://localhost:8080/SpringSecurity/login。
需要登录:
输入在spring-security.xml中配置的具备USER角色的用户名wangwu和错误密码123后点击登录按钮,登录失败,出现登录失败画面。
输入正确的wangwu和123456,则登录成功,自动跳转到导致用户登录的待访问页面:
至此,用户登录成功。
由于用户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,以及默认的用户名和密码字段的字段名为username和password,并添加了隐藏字段_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配置的用户登录