Acegi.docx
《Acegi.docx》由会员分享,可在线阅读,更多相关《Acegi.docx(13页珍藏版)》请在冰豆网上搜索。
Acegi
一、Acegi是什么?
Acegi是一个基于Spring的IOC和AOP技术实现的安全认证框架.作为一个安全认证框架,它包括"认"和"证"2个部分.认:
识别操作者的身份;"证":
证明操作者是否拥有访问和操作某些的资源的权限.在进行认证之前,Acegi通过对方法或者URI请求进行拦截,分析认证信息.所以Acegi实现包括安全拦截、认证管理、访问决策管理三部分.
二、名词及部分解释
Authentication对象:
包含了Credential(证书)和Principal的授权信息.同时还可以包含关于发起认证请求的客户的其他信息,如IP地址;
ContextHolder对象:
使用ThreadLocal储存Authentication对象的地方.
三、基本实现原理
1.安全拦截
在Web应用程序中,使用Filter过滤器拦截请求,通过FilterSecurityInterceptor实施身份认证并强制安全性;另外,Acegi可以使用SpringAOP的拦截机制,将"切面"应用于资源对象,生成Acegi代理对象,通过MethodSecurityInterceptor实现以确保用户只有在拥有恰当授权时才能调用受保护的资源,其中Filter过滤器的安全拦截为下面总结的重点.
由于Acegi是基于Spring的IOC和AOP技术实现的,所以,我们首先需要装载Web应用的Spring上下文,在Web.xml中配置如下,其中securityAcegi.xml用来配置Acegi:
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
其次,继续在web.xml中声明过滤器,对所有的http请求进行拦截.
FilterToBeanProxy顾名思义就是将Acegi过滤器Bean的代理,它将所有的http请求一次分派给targetClass这个目标Bean.FilterChainProxy是过滤器链代理Bean.
AcegiFilterChainProxy
org.acegisecurity.util.FilterToBeanProxy
targetClass
org.acegisecurity.util.FilterChainProxy
AcegiFilterChainProxy
/*
在securityAcegi.xml中声明FilterChainProxy的实例,来处理所有的请求,FilterChainProxy是一个过滤器链的代理Bean,所有的请求会在过滤器间依次进行过滤.
class="org.acegisecurity.util.FilterChainProxy">
--转化为小写-->
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
--使用ANT类型的正则表达式-->
PATTERN_TYPE_APACHE_ANT
/**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,rememberMeProcessingFilter,logoutFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor
下面分别介绍过滤器及其实现:
HttpSessionContextIntegrationFilter
该Filter负责每次请求从HttpSession的attribute中获取Authentication对象,然后存于一个新的ContextHolder对象中,这样可以让该次请求过程中的任何Filter都可以通过ContextHolder来共享Authentication,而不需要从HttpSession中取,减少传HttpRequest参数的麻烦.在HttpRequest结束后再将ContextHolder中的Authentication对象存回到HttpSession中供下次HttpRequest使用,最后把刚才生成的ContextHolder对象销毁.这样就达到了让Authentication对象跨越多个请求的目的.注意此filter须在调用其他Acegifilter前使用:
--从Session中获取Authentication对象-->
class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"/>
该Filter负责处理登陆身份验证.当接受到与filterProcessesUrl所定义相同的请求时,它会首先通过AuthenticationManager来验证用户身份.如果验证成功,则重定向到defaultTargetUrl所定义的成功登陆页面.如果验证失败,则再从rememberMeServices中获取用户身份,若再获取失败,则重定向到auhenticationFailureUrl所定义的登陆失败页面
--HTML表单认证处理filter-->
class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
ref="authenticationManager"/>
--登陆失败转向的页面-->
--/accegi_b/login.jsp?
login_error=1-->
/accegi_b/login.jsp?
login_error=1
--登陆成功转向的页面-->
/index.do
--要验证的地址-->
/j_acegi_security_check
--出现异常所对应的地址-->
--登陆失败org.acegisecurity.AuthenticationException=/login.jsp?
error=fail
--已登陆了org.acegisecurity.concurrent.ConcurrentLoginException=/login.jsp?
error=too
class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
---->
--key是用来保证cookie的真实性,有效性-->
该Filter负责处理退出登录后所需要的清理工作.它会把session销毁,把ContextHolder清空,把rememberMeService从cookies中清除掉,然后重定向到指定的退出登陆页面.
--注销处理filter-->
class="org.acegisecurity.ui.logout.LogoutFilter">
--定义用户注销的地址-->
--离开后所转向的位置-->
---->
该Filter会首先调用AuthenticationManager判断用户是否已登陆认证,如还没认证成功,则重定向到登陆界面.认证成功,则从Authentication中获取用户的权限.然后从objectDefinitionSource属性获取各种URL资源所对应的权限.最后调用AccessDecisionManager来判断用户所拥有的权限与当前受保护的URL资源所对应的权限是否相匹配.如果匹配失败,则返回403错误给用户.匹配成功则用户可以访问受保护的URL资源
--对请求进行拦截,访问前进行权限检查-->
class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
ref="authenticationManager"/>
--定义了什么样的资源需要什么样的角色-->
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/hello.htm=ROLE_ANONYMOUS,ROLE_USER
/logoff.jsp=ROLE_ANONYMOUS,ROLE_USER
/switchuser.jsp=ROLE_SUPERVISOR
/j_acegi_switch_user=ROLE_SUPERVISOR,ROLE_ADMIN
/admin/**=ROLE_ADMIN
SecurityContextHolderAwareRequestFilter
该Filter负责通过DecorateModel(装饰模式),装饰的HttpServletRequest对象.其Wapper是ServletRequest包装类HttpServletRequestWrapper的子类(SavedRequestAwareWrapper或者SecurityContextHolderAwareRequestWrapper),附上获取用户权限信息,request参数,header,Date,headers和cookies的方法.
该Filter负责处理HTTP头的认证信息,如从Spring远程协议(如Hessian和Burlap)或普通的浏览器如IE,Navigator的HTTP头中获取用户信息,将他们转交给通过authenticationManager属性装配的认证管理器.如果认证成功,会将一个Authentication对象放到会话中,否则,如果认证失败,会将控制转交给认证入口点(通过authenticationEntryPoint属性装配)
class="org.acegisecurity.ui.basicauth.BasicProcessingFilterEntryPoint">
ContactsRealm
该Filter负责在用户登录后在本地机上记录用户cookies信息,免除下次再次登陆.检查AuthenticationManager中是否已存在Authentication对象,如果不存在则会调用RememberMeServices的aotoLogin方法来从cookies中获取Authentication对象
--利用cookie自动登陆-->
class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter">
ref="authenticationManager"/>
class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
---->
--key是用来保证cookie的真实性,有效性-->
该Filter负责为当不存在任何授权信息时,自动为Authentication对象添加userAttribute中定义的匿名用户权限
class="org.acegisecurity.providers.anonymous.AnonymousProcessingFilter">
value="anonymousUser,ROLE_ANONYMOUS"/>
该过滤器负责处理各种异常,然后重定向到相应的页面中.
class="org.acegisecurity.ui.ExceptionTranslationFilter">
class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
2.认证管理
在Acegi中,通过认证管理器负责确定用户身份,一个认证管理器由authenticationManager接口进行定义.
Acegi提供了一个authenticationManager的实现AuthenticationProvider,它负责把
第二个文档
关键字:
web框架
对于任何一个完整的应用系统,完善的认证和授权机制是必不可少的.在基于SpringFramework的WEB应用中,我们可以使用Acegi作为安全架构的实现.本文将介绍如何在基于Spring构架的Web应用中使用Acegi,并且详细介绍如何配置和扩展Acegi框架以适应实际需要.
1.概述
Acegi是一个专门为SpringFramework应用提供安全机制的开放源代码项目,全称为AcegiSecuritySystemforSpring,当前版本为
0.8.3.它使用了Spring的方式提供了安全和认证安全服务,包括使用BeanContext,拦截器和面向接口的编程方式.通过精心
配置Acegi安全系统能够轻松地适用于复杂的安全需求.它既能应用于WEB应用也能应用于非WEB应用.在本文的示例程序
里,我将演示如何将Acegi应用于WEB应用程序.通过这个例子详细介绍如何配置Acegi的各个组件,同时介绍如何扩展Acegi
使其能够从数据库中读取配置信息.
2.例子说明
本文的例子是一个联系人管理程序,使用SpringFramework1.2.4和Acegi0.8.3,数据库采用Mysql.程序的目录结构如下:
acegi-sample
contactadd.jsp//增加联系人页面
contactedit.jsp//编辑联系人页面
contactlist.jsp//联系人列表页面
contactmainterance.jsp//联系人操作页面
index.jsp//主页面
login.jsp//登录页面
logoff.jsp//登出页面
WEB-INF
web.xml
applicationContext-basic.xml
applicationContext-security-acegi.xml
log4j.properties
src
sample//java代码目录
classes
lib//依赖包目录
db//建表脚本目录
3.配置文件说明
接下来,我们将进入本文的重要内容,开始对Acegi应用程序所牵涉到的配置文件进行一一说明.
3.1web.xml
首先声明SpringFramework的配置文件列表.为了便于管理,将业务方法相关的配置文件和Acegi安全配置相关的配置文件分
开.
<context-param></context-param>
<param-name></param-name>contextConfigLocation
<param-value></param-value>
/WEB-INF/applicationContext-basic.xml
/WEB-INF/applicationContext-security-acegi.xml
其次声明Acegi过滤器.
<filter>&