您的位置:首页 > 其它

Acegi组件的一些说明

2009-11-02 14:41 330 查看
1.Filter 组件

HttpSessionContextIntegrationFilter

该Filter
负责每次请求从HttpSession中获取Authentication对象,然后把Authentication存于一个新的
ContextHolder对象(其实质上只是一个ThreadLocal对象)中,则让该次请求过程中的任何Filter都可以通过
ContextHolder来共享Authentication,而不需要从HttpSession中取,减少传HttpRequest参数的麻烦.在请
求完后把Authentication对象保存到HttpSession中供下次请求使用,最后把刚才生成的ContextHolder对象销毁.这样就
达到了让Authentication对象跨越多个请求的目的

注意此filter须在调用其他Acegi filter前使用:

<bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter">

</bean>

AuthenticationProcessingFilter

该Filter
负责处理登陆身份验证.当接受到与filterProcessesUrl所定义相同的请求时,它会首先通过AuthenticationManager来
验证用户身份.如果验证成功,则重定向到defaultTargetUrl所定义的成功登陆页面.如果验证失败,则再从
rememberMeServices中获取用户身份,若再获取失败,则重定向到auhenticationFailureUrl所定义的登陆失败页面

<bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">

<property name="authenticationManager"><ref bean="authenticationManager"/></property>

<property name="authenticationFailureUrl"><value>/acegilogin.jsp?login_error=1</value></property>

<property name="defaultTargetUrl"><value>/</value></property>

<property name="filterProcessesUrl"><value>/j_acegi_security_check</value></property>

<property name="rememberMeServices"><ref local="rememberMeServices"/></property>

</bean>

LogoutFilter

该Filter负责处理退出登录后所需要的清理工作.它会把session销毁,把ContextHolder清空,把rememberMeService从cookies中清除掉,然后重定向到指定的退出登陆页面.

<bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter">

<constructor-arg value="/index.jsp"/> <!-- URL redirected to after logout ->

<constructor-arg>

<list>

<ref bean="rememberMeServices"/>

<bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/>

</list>

</constructor-arg>

</bean>

FilterInvocationInterceptor

该Filter
会首先调用AuthenticationManager判断用户是否已登陆认证,如还没认证成功,则重定向到登陆界面.认证成功,则从
Authentication中获取用户的权限.然后从objectDefinitionSource属性获取各种URL资源所对应的权限.最后调用
AccessDecisionManager来判断用户所拥有的权限与当前受保护的URL资源所对应的权限是否相匹配.如果匹配失败,则返回403错误给
用户.匹配成功则用户可以访问受保护的URL资源

<bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">

<property name="authenticationManager"><ref bean="authenticationManager"/></property>

<property name="accessDecisionManager"><ref local="httpRequestAccessDecisionManager"/></property>

<property name="objectDefinitionSource">

<value>

CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON

PATTERN_TYPE_APACHE_ANT

/index.jsp=ROLE_ANONYMOUS,ROLE_USER

/hello.htm=ROLE_ANONYMOUS,ROLE_USER

/logoff.jsp=ROLE_ANONYMOUS,ROLE_USER

/switchuser.jsp=ROLE_SUPERVISOR

/j_acegi_switch_user=ROLE_SUPERVISOR

/acegilogin.jsp*=ROLE_ANONYMOUS,ROLE_USER

/**=ROLE_USER

</value>

</property>

</bean>

SecurityContextHolderAwareRequestFilter

该Filter 负责通过Decorate
Model(装饰模式),装饰的HttpServletRequest对象.其Wapper是ServletRequest包装类
HttpServletRequestWrapper的子类(SavedRequestAwareWrapper或者
SecurityContextHolderAwareRequestWrapper),附上获取用户权限信息,request参数,header,
Date,headers和cookies的方法.

<bean id="securityContextHolderAwareRequestFilter"
class="org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter"
/>

BasicProcessingFilter

该Filter负责处理HTTP头的认证信息,如从Spring远程协议(如Hessian和Burlap)或普通的浏览器如
IE,Navigator的HTTP头中获取用户信息,将他们转交给通过authenticationManager属性装配的认证管理器。如果认证成
功,会将一个Authentication对象放到会话中,否则,如果认证失败,会将控制转交给认证入口点(通过
authenticationEntryPoint属性装配)

<bean id="basicProcessingFilter" class="org.acegisecurity.ui.basicauth.BasicProcessingFilter">

<property name="authenticationManager"><ref local="authenticationManager"/></property>

<property name="authenticationEntryPoint"><ref local="basicProcessingFilterEntryPoint"/></property>

</bean>

<bean id="basicProcessingFilterEntryPoint" class="org.acegisecurity.ui.basicauth.BasicProcessingFilterEntryPoint">

<property name="realmName"><value>Contacts Realm</value></property>

</bean>

RememberMeProcessingFilter

该Filter 负责在用户登录后在本地机上记录用户cookies信息,免除下次再次登陆。检查AuthenticationManager
中是否已存在Authentication对象,如果不存在则会调用RememberMeServices的aotoLogin方法来从cookies中
获取Authentication对象

<bean id="rememberMeProcessingFilter" class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter">

<property name="authenticationManager" ref="authenticationManager" />

<property name="rememberMeServices" ref="rememberMeServices" />

</bean>

AnonymousProcessingFilter

该Filter负责为当不存在任何授权信息时,自动为Authentication对象添加userAttribute中定义的匿名用户权限

<bean id="anonymousProcessingFilter" class="org.acegisecurity.providers.anonymous.AnonymousProcessingFilter">

<property name="key" value="changeThis" />

<property name="userAttribute" value="anonymousUser,ROLE_ANONYMOUS" />

</bean>

ExceptionTranslationFilter

该过滤器负责处理各种异常,然后重定向到相应的页面中。

<bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">

<property name="authenticationEntryPoint">

<bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">

<property name="loginFormUrl" value="/login.jsp" />

<property name="forceHttps" value="false" />

</bean>

</property>

<property name="accessDeniedHandler">

<bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl">

<property name="errorPage" value="/accessDenied.jsp" />

</bean>

</property>

</bean>

2.拦截器组件

MethodSecurityInterceptor

该拦截器实现了org.aopalliance.intercept.MethodInterceptor接口.在方法被调用之前,拦截器会先调

AuthenticationManager判断用户身份是否已验证,然后从objectDefinitionSource中获取方法所应用的权限,再调
用AccessDecisionManager来匹配用户权限和方法对应的权限.如果用户没有足够权限调用当前方法,则抛出
AccessDeniedException是方法不能被调用.调用runAsManager,使在调用方法前动态改变authentication中获
取用户权限.

<bean id="securityInterceptor" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">

<property name="validateConfigAttributes">

<value>false</value>

</property>

<property name="authenticationManager">

<ref local="authenticationManager" />

</property>

<property name="accessDecisionManager">

<ref local="accessDecisionManager" />

</property>

<property name="runAsManager">

<ref local="runAsManager" />

</property>

<property name="objectDefinitionSource">

<value>

sample.contact.ContactManager.create=ROLE_USER

sample.contact.ContactManager.getAllRecipients=ROLE_ADMIN

</value>

</property>

</bean>

BeanNameAutoProxyCreator

设置AOP代理的最简单方法就是用Spring的BeanNameAutoProxyCreator.在BeanNameAutoProxyCreator中选出你所需要的interceptor,和列出你所需要保护的Bean.

<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

<property name="proxyTargetClass" value="true" />

<property name="interceptorNames">

<list>

<idref local="securityInterceptor" />

</list>

</property>

<property name="beanNames">

<list>

<idref bean="userManager"/>

<idref bean="roleManager"/>

<idref bean="rescManager"/>

</list>

</property>

</bean>

3.其他组件

AccessDecisionManager

AccessDecisionManager
接口有decide()和support()方法.decide()方法是进行决策是否批准通过,如果没有抛出
AccessDeniedException则为允许访问资源,否则拒绝访问.support()方法是根据配置属性和受保护资源的类来判断是否需要对该
资源作出决策判断.

AccessDecisionManager有三个实现类,功能各不相同:

AffirmativeBased:当至少有一个Voter投允许票才通过

UnanimousBased:没有Voter投反对票时才通过

ConsensusBased:当所有Voter都投允许票时才通过

<bean id="accessDecisionManager" class="org.acegisecurity.vote.UnanimousBased">

<property name="allowIfAllAbstainDecisions">

<value>false</value>

</property>

<property name="decisionVoters">

<list>

<ref local="roleVoter" />

</list>

</property>

</bean>

<bean id="roleVoter" class="org.acegisecurity.vote.RoleVoter" />

AuthenticationManager

AuthenticationManager的其中一个实现是ProviderManager,它负责把身份验证的工作委托给一个或多个Provider(认证提供者).

Provider
都是实现AuthenticationProvider接口,该接口有两个方法authenticate()和support().
authenticate()方法会尝试验证用户身份,若验证成功则返回一个Authentication对象,否则抛出一个
AuthenticationException.

support()方法会评估当前Authentication对象是否适合这个Provider来进行进一步的处理,而不是指已经通过.

Provir有多个实现.例如daoAuthenticationProvider,anonymousAuthenticationProvider,rememberMeAuthenticationProvider.

<bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">

<property name="providers">

<list>

<ref local="daoAuthenticationProvider"/>

<ref local="anonymousAuthenticationProvider"/>

<ref local="rememberMeAuthenticationProvider"/>

</list>

</property>

</bean>

daoAuthenticationProvider负责提供用户信息,包括用户名和密码。其中取用户名密码的工作就交给
userDetailsService来做。通过userCache来缓存用户信息,减少查询数据库次数。用passwordEncoder
来使用加密密码。userDetailsService的接口实现有jdbcDaoImpl和inMemoryDaoImpl。jdbcDaoImpl通
过数据库获取用户名和密码,而inMemoryDaoImpl则只是通过xml定义的方式来获取。

userCache的接口实现有EhCacheBasedUserCache和NullUserCache。NullUserCache实际上就是不进行缓存。EhCacheBasedUserCache是基于ehcache的开源缓存项目来实现的。

passwordEncoder是使用加密器对用户输入的明文进行加密。Acegi提供了三种加密器:

PlaintextPasswordEncoder---默认,不加密,返回明文.

ShaPasswordEncoder---哈希算法(SHA)加密

d5PasswordEncoder---消息摘要(MD5)加密

<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">

<property name="userDetailsService"><ref local="jdbcDaoImpl"/></property>

<property name="userCache"><ref local="userCache"/></property>

<property name="passwordEncoder"><ref local="passwordEncoder"/></property>

</bean>

<bean id="jdbcDaoImpl" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">

<property name="dataSource"><ref bean="dataSource"/></property>

</bean>

<bean id="userCache" class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache">

<property name="cache"><ref local="userCacheBackend"/></property>

</bean>

<bean id="passwordEncoder" class="org.acegisecurity.providers.encoding.Md5PasswordEncoder"/>

<bean id="userCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean">

<property name="cacheManager">

<ref local="cacheManager"/>

</property>

<property name="cacheName">

<value>userCache</value>

</property>

</bean>

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/>

anonymousAuthenticationProvider负责匿名用户的AnonymousAuthenticationToken的进一步处理

<bean id="anonymousAuthenticationProvider"
class="org.acegisecurity.providers.anonymous.AnonymousAuthenticationProvider">

<property name="key"><value>foobar</value></property>

</bean>

rememberMeAuthenticationProvider负责Cookies记忆用户RememberMeAuthenticationToken的进一步处理

<bean id="rememberMeAuthenticationProvider"
class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider">

<property name="key"><value>springRocks</value></property>

</bean>

RememberMeServices

rememberMeServices 负责通过以cookie的形式保存先前的用户登录信息.在Authentication对象不存在时,
rememberMeProcessingFilter会调用rememberMeServices的autoLogin()方法,尝试在cookies
中获取用户登录信息,如果存在则并返回Authentication对象.在每次用户登录时,如果设置了RememberMe功能,在验证用户身份成功
后,则会调用loginSuccess()方法记录用信息在cookies中,否则调用loginFail()方法清楚cookie.

<bean id="rememberMeServices" class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">

<property name="userDetailsService" ref="userDetailsService" />

<property name="key" value="changeThis" />

</bean>

runAsManager

runAsmanager提供了动态替换ContextHolder中Ahthentication对象的功能.

<bean id="runAsManager" class="org.acegisecurity.runas.RunAsManagerImpl">

<property name="key">

<value>my_run_as_password</value>

</property>

</bean>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: