Spring Security学习总结一
在认识Spring Security之前,所有的权限验证逻辑都混杂在业务逻辑中,用户的每个操作以前可能都需要对用户是否有进行该项操作的权限进行判断,来达到认证授权的目的。类似这样的权限验证逻辑代码被分散在系统的许多地方,难以维护。AOP(Aspect Oriented Programming)和Spring Security为我们的应用程序很好的解决了此类问题,正如系统日志,事务管理等这些系统级的服务一样,我们应该将它作为系统一个单独的“切面”进行管理,以达到业务逻辑与系统级的服务真正分离的目的,Spring Security将系统的安全逻辑从业务中分离出来。
本文代码运行环境:
JDK6.0
spring-framework-2.5.4
spring-security-2.0.0
JavaEE5
Web容器:
Apache Tomcat6.0
IDE工具:
Eclipse3.3+MyEclipse6.5
操作系统:
Linux(Fedora 8)
这只是我个人的学习总结而已,还请高手们指出本文的不足之处。
一 Spring Security 简介
这里提到的Spring Security也就是被大家广为熟悉的Acegi Security,2007年底Acegi Security正式成为Spring Portfolio项目,并更名为Spring Security.Spring Security是一个能够为基于Spring的企业应用系统提供描述性安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC(依赖注入,也称控制反转)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。
通过在许多项目中实践应用以及社区的贡献,如今的Spring Security已经成为Spring Framework下最成熟的安全系统,它为我们提供了强大而灵活的企业级安全服务,如:
Ø 认证授权机制
Ø Web资源访问控制
Ø 业务方法调用访问控制
Ø 领域对象访问控制Access Control List(ACL)
Ø 单点登录(Central Authentication Service)
Ø X509认证
Ø 信道安全(Channel Security)管理等功能
当保护Web资源时,Spring Security使用Servlet 过滤器来拦截Http请求进行身份验证并强制安全性,以确保WEB资源被安全的访问。如下图是Spring Security的主要组件图(摘自《Spring in Action》):
图1 Spring Security的基本组件
无论是保护WEB资源还是保护业务方法或者领域对象,Spring Security都的通过上图中的组件来完成的。本文主要阐述如何使用Spring Security对WEB应用程序的资源进行安全访问控制,并通过一个简单的实例来对Spring Security提供的各种过滤器的功能和配置方法进行描述。
二 保护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过滤器配置:
3 配置applicationContext-security.xml
3.1 FilterChainProxy过滤器链
FilterChainProxy会按顺序来调用一组filter,使这些filter即能完成验证授权的本质工作,又能享用Spring Ioc的功能来方便的得到其它依赖的资源。FilterChainProxy配置如下:
LogoutFilter的构造函数需要两个参数,第一个是退出系统后系统跳转到的URL,第二个是一个LogoutHandler类型的数组,这个数组里的对象都实现了LogoutHandler接口,并实现了它的logout方法,用户在发送退出请求后,会一次执行LogoutHandler数组的对象并调用它们的 logout方法进行一些后续的清理操作,主要是从SecurityContextHolder对象中清楚所有用户的认证信息(Authentication对象),将用户的会话对象设为无效,这些都时由SecurityContextLogoutHandler来完成。LogoutFilter还会清除Cookie记录,它由另外一个Bean来完成(RememberMeServices)。
<ref bean="rememberMeServices"/>标记指向了我们另外配置的一个Bean:
从上面的表中可以看出,系统为我们提供了不同的认证提供者,每个认证提供者会对自己指定的证明信息进行认证,如DaoAuthenticationProvider仅对UsernamePasswordAuthenticationToken这个证明信息进行认证。
在实际项目中,用户的身份和权限信息可能存储在不同的安全系统中(如数据库,LDAP服务器,CA中心)。
作为程序员,我们可以根据需要选择不同的AuthenticationProvider(认证提供者)来对自己的系统提供认证服务。
这里我们着重介绍DaoAuthenticationProvider,它从数据库中读取用户信息验证身份,配置如下:
即使是系统的开发者或者说是最终用户,都不应该看到系统中有明文的密码。所以,Spring Security考虑的还是很周到的,为我们提供的密码加密的功能。正如你在Dao认证提供者(DaoAuthenticationProvider)中看到的,passwordEncoder属性配置的就是一个密码加密程序(密码编码器)。这里我们使用MD5加密,可以看配置文件中的scott用户,你还能看出他的密码是什么吗?当然这里只是演示功能,其它用户还是没有改变,你可以自己试试。系统为我们提供了一些常用的密码编码器(这些编码器都位于org.springframework.secu rity.providers.encoding包下):
PlaintextPasswordEncoder(默认)——不对密码进行编码,直接返回未经改变的密码;
Md4PasswordEncoder ——对密码进行消息摘要(MD4)编码;
Md5PasswordEncoder ——对密码进行消息摘要(MD5)编码;
ShaPasswordEncoder ——对密码进行安全哈希算法(SHA)编码。
你可以根据需要选择合适的密码编码器,你也可以设置编码器的种子源(salt source)。一个种子源为编码提供种子(salt),或者称编码的密钥,这里不再赘述。
这里附加介绍了不少东西,希望你还没有忘记在AuthenticationManager(认证管理器)中还配置了一个名为sessionController的Bean,这个Bean可以阻止用户在进行了一次成功登录以后在进行一次成功的登录。在 applicationContext-security.xml配置文件添加sessionController的配置:
以上是 Spring Security学习总结一 的全部内容, 来源链接: utcz.com/p/206244.html