1. 搭建Spring security 环境.
1) spring 项目: 导入Spring 的两个Jar包, 加入 Spring 的配置文件(注总加入 security 命名空间)
2) 加入 Spring security 的一个 Jar包
3) 在 web.xml 文件中加信相关配置
1> 搭建 spring 环境
web.xml
<!-- 搭建 spring 环境 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
2> 加入 Spring security 框架的过滤器
web.xml
<!-- 加入 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>
3> 在Spring 的配置文件中配置 Spring security 的应用
applicationContext-security.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/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.2.xsd"> <!-- 配置 spring-security 的Http服务 --> <http auto-config="true"> <!-- 哪些页面需要受到 spirng-sceurity 的保护, 以及访问这些页面的权限是什么 --> <intercept-url pattern="/index.jsp" access="ROLE_ADMIN, ROLE_USER" /> <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" /> <!-- 配置登出 --> <logout logout-url="/logoff" logout-success-url="/bye.jsp" invalidate-session="false" /> <!-- 配置登录 --> <form-login login-page="/login.jsp" login-processing-url="/login" default-target-url="/index_1.jsp" always-use-default-target="true" /> </http> <!-- 配置 spring-security 的权限信息 --> <authentication-provider> <!-- 配置security 的用户信息 --> <user-service> <user name="user" password="user" authorities="ROLE_USER" /> <user name="admin" password="admin" authorities="ROLE_ADMIN" /> </user-service> </authentication-provider> </beans:beans>
2. 用于测试的JSP页面
login.jsp 自定义的 登录界面
<html>
<head>
<title>Login Page</title>
</head>
<body οnlοad='document.f.j_username.focus();'>
<h3>zhangq</h3>
<form name='f' action='login' 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 type='checkbox' name='_spring_security_remember_me'/></td>
<td>Remember me on this computer.</td></tr>
<tr><td colspan='2'><input name="submit" type="submit"/></td></tr>
<tr><td colspan='2'><input name="reset" type="reset"/></td></tr>
</table>
</form>
</body>
</html>
index-1.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
index page. <br>
sessionid= <%=session.getId() %> <br>
<!-- 如果权限不是 ROLE_ADMIN, 则不显示 admin.sjp 链接-->
<security:authorize ifAllGranted="ROLE_ADMIN">
<a href="./admin.jsp"> admin.sjp</a> <br><br>
</security:authorize>
<a href="logoff" >logoff</a>
</body>
</html>
admin.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
index page <br><br>
<a href="./admin.jsp">admin.jsp</a> <br>
SessionId=<%=session.getId() %><br>
<a href="logoff" >logoff</a>
</body>
</html>
bay.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
bye page. <br>
SesionId=<%=session.getId() %><br>
sessionIsNew=<%=session.isNew() %><br>
<a href="login" >Login</a>
</body>
</html>
2. 关于 DelegatingFilterProxy:
1). 是一个 Filter
2). 将 HTTP 请求委托给 Spring 应用程序上下文中的一个 Bean, 默认情况下, DelegatingFilterProxy 会把 HTTP 请求委托给和它的 <filter-name> 属性相同的 Bean 上
3. 配置登出:
1). 通过 http 节点的 logout 子节点进行配置
2). 默认的 url 为: j_spring_security_logout, 可通过 logout-url 属性修改默认的 url
3). logout-success-url 属性配置成功登出重定向页面
4). invalidate-session 属性配置是否销毁 session
4. 配置登录:
1). 通过 http 节点的 form-login 子节点进行配置
2). login-page 属性配置指定的登录页面: 但是该表单页面不能随意的定义, 例如用户名, 密码. 而应使用 spring-security 的配置方式.
3). login-processing-url 属性配置处理登陆页面的 url
4). 若直接访问登录页面, 若登录成功, 则 spring-security 默认把页面重定向到 /index.jsp 页面. 若不存在该页面,或需要重定向到其他页面,
则需要配置 default-target-url 属性; 若访问受保护的页面, 则 spring-security 框架会把请求重定向到 login-page 属性指定的页面, 若登录成功
spring-security 会把请求再重新定向到刚才请求的受保护的那个页面
5). authentication-failure-url 配置登录失败的相应页面
6). 若 always-use-default-target="true" 则只要登录成功, spring-security 都会把请求重定向到 default-target-url 属性指定的页面