一、Acegi Security 介绍
1、为基于J2EE企业应用提供了全面安全服务
2003年年底——acegi开始,当时叫“spring的acegi安全系统”。
2006年5月——acegi1.0.0最终版本发布。
2007年年底——成为spring组合项目,更名“Spring Security”。
2009年7月——Spring Security 3.0已经发布
2010年7月——Spring Security 3.1已经发
3、安全原理
安全包括认证授权两个主要操作。
“认证”是为用户建立一个他所声明的主体。主体一般是指用户,设备或可以在你系统中执行行动的其他系统。
“授权”指的一个用户能否在你的应用中执行某个操作。在到达授权判断之前,身份的主体已经由身份验证过程建立了。
这些概念是通用的,不是Spring Security特有的。
Spring Acegi拥有丰富灵活的认证模型,列举几个认证技术:
HTTP BASIC authentication headers (一个基于IEFT RFC的标准)
LDAP (一个非常常见的跨平台认证需要做法,特别是在大环境)
JA-SIG Central Authentication Service (也被称为CAS,这是一 个流行的开源单点登录系统)
Java Authentication and Authorization Service (JAAS)
Form-based authentication (提供简单用户接口的需求)
Spring Acegi在授权方面主要有三个领域
乘飞机前需要通过安检,乘客必须提供身份证以验证其身份。在通过安检进入候机室后,国航、海航、南航等不同航空公司的飞机陆续到达,但你只能登上机票上对应航班的飞机。在登机后,只能坐在机票对应的座位上——你不能抢占他人的座位,你不能在座位上刻字留念、你不能要求空姐打开机窗……
乘飞机的过程体现安全控制的流程:
安检--身份认证
登机--资源访问控制
按号就座—领域对象安全控制
2、Acegi架构
Acegi通过两个组件对象完成安全问题的处理:
AuthenticationManager(认证管理器)
AccessDecisionManager(访问控制管理器或者叫授权管理器)
在Acegi框架中,SecurityContextHolder处于非常核心的位置,它是存放认证管理器用户安全信息SecurityContext的“容器”, SecurityContext保存着用户安全访问控制所需的信息,直接被访问决策管理器使用。
HttpSessionContextIntegrationFilter通过在SecurityContextHolder和HttpSession中摆渡SecurityContext,使多个请求线程可以共享同一SecurityContext。
3、Acegi实现以filter为中心
用户认证过程
Acegi支持多种方式的用户认证:如典型的基于数据库的认证、基于LDAP的认证等。先抛开细节,看一下Acegi对受限资源进行访问控制的典型过程:
1.你点击一个链接访问一个网页;
2.浏览器发送一个请求到服务器,服务器判断出你正在访问一个受保护的资源;
3.如果此时你并未通过身份认证,服务器发回一个响应提示你进行认证——这个响应可能是一个HTTP响应代码,抑或重定向到一个指定页面;
4.根据系统使用认证机制的不同,浏览器或者重定向到一个登录页面中,或者由浏览器通过一些其它的方式获取你的身份信息(如通过BASIC认证对话框、一个Cookie);
5.浏览器再次将用户身份信息发送到服务器上(可能是一个用户登录表单的HTTP POST信息、也可能是包含认证信息的HTTP报文头);
6.服务器判断用户认证信息是否有效,如果无效,一般情况下,浏览器会要求你继续尝试,这意味着返回第3步。如果有效,则到达下一步;
7.服务器重新响应第2步所提交的原始请求,并判断该请求所访问的程序资源是否在你的权限范围内,如果你有权访问,请求将得到正确的执行并返回结果。否则,你将收到一个HTTP 403错误,这意味着你被禁止访问。
授权过程
Acegi称受保护的应用资源为“安全对象”,这包括URL资源和业务类方法。spring AOP中有前置advice(处理、拦截器、通知)、后置advice、异常advice和环绕advice 。Acegi使用环绕advice对安全对象进行保护。 Acegi通AbstractSecurityInterceptor为安全对象访问提供一致的工作模型,它按照以下流程进行工作:
1. 从SecurityContext中取出已经认证过的Authentication(包括权限信息);
2. 通过反射机制,根据目标安全对象和“配置属性”得到访问目标安全对象所需的权限;
3. AccessDecisionManager根据Authentication的授权信息和目标安全对象所需权限做出是否有权访问的判断。如果无权访问,Acegi将抛出AccessDeniedException异常,否则到下一步;
4. 访问安全对象并获取结果(返回值或HTTP响应);
5. AbstractSecurityInterceptor可以在结果返回前进行处理:更改结果或抛出异常。
三、Acegi Security配置
1、基本环境配置
第一步确保jar文件放到正确的位置(/WEB-INF/lib/)
<filter>
<filter-name>securityFilter</filter-name>
<filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
<init-param>
<param-name>targetBean</param-name>
<param-value>filterChainProxy</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>securityFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
第三步applicationContext-security.xml文件的配置
<bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy">
<property name="filterInvocationDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT /**=httpSessionContextIntegrationFilter,userPreferencesFilter,authenticationProcessingFilter </value>
</property>
</bean>
2、登录验证
3、方法保护
4、Domain Object安全(ACL)
ACL用来做细粒度权限控制所用的一种权限模型。具体到每一条数据的权限。保障Domain Object安全。
ACL最简单的描述——两个业务员每个人只能查看操作自己签的合同,而不能看到对方的合同信息。
最典型的ACL实现——操作系统(window, unix)的文件访问控制系统,精确定义了某个用户或角色对某个特定文件的读、写、执行等权限。