配置 Spring Security

发送反馈


1. 下载 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 目录。

2. 添加 Spring Security 过滤器

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

3. 配置用户信息

在 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 加密,存储在数据库中。

4. 配置角色对 URL 的访问权限

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