您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > ACEGI安全框架应用指南
ACEGI安全框架应用指南级别:中级何平系统架构师,独立顾问,培训讲师。2005年12月26日文章来源于一次acegi的项目应用。因为业务需要与acegi框架缺省的应用方式有一定的区别,故在实际应用过程中尝试了对acegi的一定量的改造工作,从而具有一定的研究和学习价值。文章中关于Acegi的介绍收入了其他文章中的内容,已在参教资料中列出资料来源。内容大纲:认识Acegi安全框架安装并运行Acegi自带的范例改造Acegi框架满足我们的业务要求具体内容:认识Acegi安全框架Acegi安全系统,是一个用于SpringFramework的安全框架,能够和目前流行的Web容器无缝集成。它使用了Spring的方式提供了安全和认证安全服务,包括使用BeanContext,拦截器和面向接口的编程方式。因此,Acegi安全系统能够轻松地适用于复杂的安全需求。安全涉及到两个不同的概念,认证和授权。前者是关于确认用户是否确实是他们所宣称的身份。授权则是关于确认用户是否有允许执行一个特定的操作。在Acegi安全系统中,需要被认证的用户,系统或代理称为Principal。Acegi安全系统和其他的安全系统不同,它并没有角色和用户组的概念关键组件Acegi安全系统包含以下七个关键的功能组件:lAuthentication对象,包含了Principal,Credential和Principal的授权信息。同时还可以包含关于发起认证请求的客户的其他信息,如IP地址。2ContextHolder对象,使用ThreadLocal储存Authentication对象的地方。3AuthenticationManager,用于认证ContextHolder中的Authentication对象。4AccessDecissionManager,用于授权一个特定的操作。5RunAsManager,当执行特定的操作时,用于选择性地替换Authentication对象。6SecureObject拦截器,用于协调AuthenticationManager,AccessDecissionManager,RunAsManager和特定操作的执行。7ObjectDefinitionSource,包含了特定操作的授权定义。这七个关键的功能组件的关系如下图所示(图中灰色部分是关键组件):安全管理对象Acegi安全系统目前支持两类安全管理对象。第一类的安全管理对象管理AOPAlliance的MethodInvocation,开发人员可以用它来保护Spring容器中的业务对象。为了使Spring管理的Bean可以作为MethodInvocation来使用,Bean可以通过ProxyFactoryBean和BeanNameAutoProxyCreator来管理,就像在Spring的事务管理一样使用。第二类是FilterInvocation。它用过滤器(Filter)来创建,并简单地包装了HTTP的ServletRequest,ServletResponse和FilterChain。FilterInvocation可以用来保护HTTP资源。通常,开发人员并不需要了解它的工作机制,因为他们只需要将Filter加入web.xml,Acegi安全系统就可以工作了。安全配置参数每个安全管理对象都可以描述数量不限的各种安全认证请求。例如,MethodInvocation对象可以描述带有任意参数的任意方法的调用,而FilterInvocation可以描述任意的HTTPURL。Acegi安全系统需要记录应用于每个认证请求的安全配置参数。例如,对于BankManager.getBalance(intaccountNumber)方法和BankManager.approveLoan(intapplicationNumber)方法,它们需要的认证请求的安全配置很不相同。为了保存不同的认证请求的安全配置,需要使用配置参数。从实现的视角来看,配置参数使用ConfigAttribute接口来表示。Acegi安全系统提供了ConfigAttribute接口的一个实现,SecurityConfig,它把配置参数保存为一个字符串。ConfigAttributeDefinition类是ConfigAttribute对象的一个简单的容器,它保存了和特定请求相关的ConfigAttribute的集合。当安全拦截器收到一个安全认证请求时,需要决定应用哪一个配置参数。换句话说,它需要找出应用于这个请求的ConfigAttributeDefinition对象。这个查找的过程是由ObjectDefinitionSource接口来处理的。这个接口的主要方法是publicConfigAttributeDefinitiongetAttributes(Objectobject),其中Object参数是一个安全管理对象。因为安全管理对象包含有认证请求的详细信息,所以ObjectDefinitionSource接口的实现类可以从中获得所需的详细信息,以查找相关的ConfigAttributeDefiniton对象。Acegi如何工作为了说明Acegi安全系统如何工作,我们设想一个使用Acegi的例子。通常,一个安全系统需要发挥作用,它必须完成以下的工作:l首先,系统从客户端请求中获得Principal和Credential;2然后系统认证Principal和Credential信息;3如果认证通过,系统取出Principal的授权信息;4接下来,客户端发起操作请求;5系统根据预先配置的参数检查Principal对于该操作的授权;6如果授权检查通过则执行操作,否则拒绝。那么,Acegi安全系统是如何完成这些工作的呢?首先,我们来看看Acegi安全系统的认证和授权的相关类图:图中绿色部分是安全拦截器的抽象基类,它包含有两个管理类,AuthenticationManager和AccessDecisionManager,如图中灰色部分。AuthenticationManager用于认证ContextHolder中的Authentication对象(包含了Principal,Credential和Principal的授权信息);AccessDecissionManager则用于授权一个特定的操作。下面来看一个MethodSecurityInterceptor的例子:beanid=bankManagerSecurityclass=net.sf.acegisecurity.intercept.method.MethodSecurityInterceptorpropertyname=validateConfigAttributesvaluetrue/value/propertypropertyname=authenticationManagerrefbean=authenticationManager//propertypropertyname=accessDecisionManagerrefbean=accessDecisionManager//propertypropertyname=objectDefinitionSourcevaluenet.sf.acegisecurity.context.BankManager.delete*=ROLE_SUPERVISOR,RUN_AS_SERVERnet.sf.acegisecurity.context.BankManager.getBalance=ROLE_TELLER,ROLE_SUPERVISOR,BANKSECURITY_CUSTOMER,RUN_/value/property/bean上面的配置文件中,MethodSecurityInterceptor是AbstractSecurityInterceptor的一个实现类。它包含了两个管理器,authenticationManager和accessDecisionManager。这两者的配置如下:beanid=authenticationDaoclass=net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImplpropertyname=dataSourcerefbean=dataSource//property/beanbeanid=daoAuthenticationProviderclass=net.sf.acegisecurity.providers.dao.DaoAuthenticationProviderpropertyname=authenticationDaorefbean=authenticationDao//property/beanbeanid=authenticationManagerclass=net.sf.acegisecurity.providers.ProviderManagerpropertyname=providerslistrefbean=daoAuthenticationProvider//list/property/beanbeanid=roleVoterclass=net.sf.acegisecurity.vote.RoleVoter/beanid=accessDecisionManagerclass=net.sf.acegisecurity.vote.AffirmativeBasedpropertyname=allowIfAllAbstainDecisionsvaluefalse/value/propertypropertyname=decisionVoterslistrefbean=roleVoter//list/property/bean准备工作做好了,现在我们来看看Acegi安全系统是如何实现认证和授权机制的。以使用HTTPBASIC认证的应用为例子,它包括下面的步骤:1.用户登录系统,Acegi从acegisecurity.ui子系统的安全拦截器(如BasicProcessingFilter)中得到用户的登录信息(包括Principal和Credential)并放入Authentication对象,并保存在ContextHolder对象中;2.安全拦截器将Authentication对象交给AuthenticationManager进行身份认证,如果认证通过,返回带有Principal授权信息的Authentication对象。此时ContextHolder对象的Authentication对象已拥有Principal的详细信息;3.用户登录成功后,继续进行业务操作;4.安全拦截器(bankManagerSecurity)收到客户端操作请求后,将操作请求的数据包装成安全管理对象(FilterInvocation或MethodInvocation对象);5.然后,从配置文件(ObjectDefinitionSource)中读出相关的安全配置参数ConfigAttributeDefinition;6.接着,安全拦截器取出ContextHolder中的Authentication对象,把它传递给AuthenticationManager进行身份认证,并用返回值更新ContextHolder的Authentication对象;7.将Authentication对象,ConfigAttributeDefinition对象和安全管理对象(secureObject)交给AccessDecisionManager,检查Principal的操作授权;8.如果授权检查通过则执行客户端请求的操作,否则拒绝;AccessDecisionVoter注意上节的accessDecisi
本文标题:ACEGI安全框架应用指南
链接地址:https://www.777doc.com/doc-1248734 .html