配置 Spring Security |
登录:http://static.springsource.org/spring-security/site/downloads.html,下载 Spring Security,示例中使用的 Spring Security 版本为3.1.0。
下载 spring-web.jar、jstl.jar(http://jstl.java.net)
解压 Spring Security 后,将 dist 下的*.jar,以及 spring-web.jar、jstl.jar 放置到 %SuperMap iServer_HOME%/webapps/iserver/WEB-INF/lib 目录。
在 iServer 的 web.xml 中增加 Spring Security 过滤器(web.xml 位于%SuperMap iServer_HOME%/webapps/iserver/WEB-INF),名为 springSecurityFilterChain,web.xml 中已有一个名为 iserver-services 的 Filter,springSecurityFilterChain 要放在 iserver-services 的上面。清单如下:
<!--Sping Security Filter 的配置--> <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/applicationContext-security.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> </listener>
其中 <url-pattern>/*</url-pattern> 表示所有的 URL 都将先经过 springSecurityFilterChain ,从而达到安全控制的目的;applicationContext-security.xml 为 Spring Security 的配置文件,用户的权限在这里配置。applicationContext-security.xml 的文件框架如下:
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"> <!—添加的配置项--> ... </beans:beans>
在 applicationContext-security.xml 中添加用户 china、world,china 属于 ROLE_CHINA 角色,world 属于 ROLE_WORLD 角色,配置项如下:
<authentication-manager> <authentication-provider> <user-service> <user name="china" password="china" authorities="ROLE_CHINA" /> <user name="world" password="world" authorities="ROLE_WORLD" /> </user-service> </authentication-provider> </authentication-manager>
作为示例,这里用的是明文直接写在配置项中的方式,也可通过 Encoder 加密,存储在数据库中。
在 applicationContext-security.xml 中添加 URL 限制,限制/services/map-china400/**,即 map-china400的所有服务示例只能被 ROLE_CHINA 角色访问,限制/services/map-world/**只能被 ROLE_WORLD 角色访问。
<http use-expressions="true"> <intercept-url pattern="/services/map-china400/**" access="hasRole('ROLE_CHINA')" /> <intercept-url pattern="/services/map-world/**" access="hasRole('ROLE_WORLD')" /> <intercept-url pattern="/**" access="permitAll" /> <form-login /> <logout /> <remember-me /> <!-- 限制用户拥有的 session 个数 --> <session-management invalid-session-url="/timeout.jsp"> <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" /> </session-management> </http>
<session-management />限制了用户拥有的 session 个数为1,当 session 过期时,使用 timeout.jsp 进行提示,timeout.jsp 的代码如下:
<%@page session="false" %> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>Session 过期</title> </head> <body> <div id="content"> <h2>非法的 Session</h2> <p> session 已过期,请 <a href="<c:url value='/'/>">重新登录</a>. </p> </div> </body> </html>