二 保护Web资源
Spring Security提供了很多的过滤器,它们拦截Servlet请求,并将这些请求转交给认证处理过滤器和访问决策过滤器进行处理,并强制安全性,认证用户身份和用户权限以达到保护Web资源的目的。对于Web资源我们大约可以只用6个过滤器来保护我们的应用系统,下表列出了这些安全过滤器的名称作用以及它们在系统中的执行顺序:
过 滤 器 | 作 用 |
通道处理过滤器 | 确保请求是在安全通道(HTTP和HTTPS)之上传输的 |
认证处理过滤器 | 接受认证请求,并将它们转交给认证管理器进行身份验证 |
CAS处理过滤器 | 接受CAS服务票据,验证Yale CAS(单点登录)是否已经对用户进行了认证 |
HTTP基本授权过滤器 | 处理使用HTTP基本认证的身份验证请求 |
集成过滤器 | 处理认证信息在请求间的存储(比如在HTTP会话中) |
安全强制过滤器 | 确保用户己经认证,并且满足访问一个受保护Web资源的权限需求 |
接下来,通过一个实例来说明它们的具体使用方法和如何在Spring中进行配置。
1 建立Spring Security项目
首先在MyEclipse中创建一个Web Project,并使用MyEclipse工具导入Spring项目的依赖JAR包,并生成默认的,这里暂时不会用到这个文件,本文只是通过一个简单的实例来说明如何配置使用Spring Security,不会涉及到数据库,而是使用一个用户属性(users.properties)文件来保存用户信息(包括用户名,密码及相应的权限),但在实际的项目中,我们很少会这样做,而是应该把用户信息存在数据库中,下一篇文章中将会详细介绍并用到这个文件来配置Hibernate,这里我们保留它。
现在还需要为项目导入Spring Security的JAR包,它没有包括在Spring Framework中,你可以从http://www.springframework.org/download/下载,并将spring-security-core-2.0.0.jar(这是核心代码库)和spring-security-core-tiger- 2.0.0.jar(和annotation有关的,比如使用注解对方法进行安全访问控制,在下一篇中会用到)拷贝到项目的lib目录下,其中也包括两个实例(tutorial和contacts),并且两个实例中都包括了如何使用Spring 2.0的命名空间来配置Spring Security,无论你对Spring 2.0命名空间的使用是否了解,它将使我们的配置文件大大缩短,简化开发,提高生产效率。到此,我们的Spring Security项目就建好了,项目目录结构如下图所示:
图2 项目目录结构
2 配置web.xml
Spring Security使用一组过滤器链来对用户进行身份验证和授权。首先,在web.xml文件中添加FilterToBeanProxy过滤器配置:
2 < filter-name > springSecurityFilterChain </ filter-name >
3 < filter-class >
4 org.springframework.security.util.FilterToBeanProxy
5 </ filter-class >
6 < init-param >
7 < param-name > targetClass </ param-name >
8 < param-value >
9 org.springframework.security.util.FilterChainProxy
10 </ param-value >
11 </ init-param >
12 </ filter >
13
org.springframework.security.util.FilterToBeanProxy实现了Filter接口,它通过调用 WebapplicationContextUtils类的getWebApplicationnContext(servletContext)方法来获取Spring的应用上下文句柄,并通过getBean(beanName)方法来获取Spring受管Bean的对象,即这里targetClass 参数配置的Bean,并通过调用FilterChain Proxy的init()方法来启动Spring Security过滤器链进行各种身份验证和授权服务(FilterChainProxy类也是实现了Filter接口),从而将过滤功能委托给 Spring的FilterChainProxy受管Bean(它维护着一个处理验证和授权的过滤器列表,列表中的过滤器按照一定的顺序执行并完成认证过程),这样即简化了web.xml文件的配置,又能充分利用 Spring的IoC功能来完成这些过滤器执行所需要的其它资源的注入。
当用户发出请求,过滤器需要根据web.xml配置的请求映射地址来拦截用户请求,这时Spring Security开始工作,它会验证你的身份以及当前请求的资源是否与你拥有的权限相符,从而达到保护Web资源的功能,下面是本例所要过滤的用户请求地址:
2
3 < filter-name > springSecurityFilterChain </ filter-name >
4
5 < url-pattern > /j_spring_security_check </ url-pattern >
6
7 </ filter-mapping >
8
9 < filter-mapping >
10
11 < filter-name > springSecurityFilterChain </ filter-name >
12
13 < url-pattern > /* </ url-pattern >
14
15 </ filter-mapping >
提示: /j_spring_security_check是Spring Security默认的进行表单验证的过滤地址,你也可以修改为别的名称,但是需要和 applicationContext-security.xml中相对应,当然还会涉及到其它一些默认值(可能是一个成员变量,也可能是别的请 求地址),在下文我们将看到,建议你在阅读此文的同时,应该参照Spring Security项目的源代码,便于你更好的理解。 |