常言笑的家

Spring, Hibernate, Struts, Ajax, RoR

Acegi 使用 Acl(1)

首先要配置一个filter,这个filter用一个代理bean写在了spring里面,其实根正常的filter没有任何区别。

代码
1<bean id="securityEnforcementFilter"   
2    class="org.acegisecurity.intercept.web.SecurityEnforcementFilter">   
3    <property name="filterSecurityInterceptor">   
4        <ref local="filterInvocationInterceptor" />   
5    </property>   
6    <property name="authenticationEntryPoint">   
7        <ref local="authenticationProcessingFilterEntryPoint" />   
8    </property>   
9</bean>  

 

"filterInvocationInterceptor" 是一个拦截器,说是拦截器,其实就是在filter里面执行一下他的拦截方法,这里可没有什么aop.
authenticationEntryPoint 交验失败的时候转到的地方,为什么说是地方,因为通过配置可以转到其它的url甚至其它的协议下(http 转到 https等等)
 
代码
 1<bean id="authenticationProcessingFilterEntryPoint"   
 2    class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">   
 3    <property name="loginFormUrl">   
 4        <value>/error.security</value>   
 5    </property>   
 6    <property name="forceHttps">   
 7        <value>false</value>   
 8    </property>   
 9</bean>  
10

 

这个就是失败的时候转到的地方,我们可以配置url和是否使用https

 

代码
 1<bean id="filterInvocationInterceptor"   
 2    class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">   
 3    <property name="authenticationManager">   
 4        <ref bean="authenticationManager" />   
 5    </property>   
 6    <property name="accessDecisionManager">   
 7        <ref local="httpRequestAccessDecisionManager" />   
 8    </property>   
 9    <property name="objectDefinitionSource">   
10        <value>   
11            CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON    
12            PATTERN_TYPE_APACHE_ANT    
13            /index.jsp=ROLE_ANONYMOUS,ROLE_USER    
14            /j_acegi_switch_user=ROLE_SUPERVISOR   
15            /login.security=ROLE_ANONYMOUS,ROLE_USER                /test.do=ROLE_CODER   
16            /**.do*=ROLE_USER    
17        </value>   
18    </property>   
19</bean>  

 

这个就是前面提到的拦截器。简单解释一下:
authenticationManager 在acegi里面的主要作用就是管理维护用户的权限角色等信息,比方说想要用户的ROLE就要在这里面拿了。里面配置了多种全县的来源,可以从DAO里面来(就是数据库里面),可以是cookies里面的,也可以是匿名的权限,每种权限都以一种Provider的形式提供:

代码
 1<bean id="authenticationManager"   
 2    class="org.acegisecurity.providers.ProviderManager">   
 3    <property name="providers">   
 4        <list>   
 5            <ref local="daoAuthenticationProvider" />   
 6            <ref local="anonymousAuthenticationProvider" />   
 7            <ref local="rememberMeAuthenticationProvider" />   
 8        </list>   
 9    </property>   
10</bean>

 

objectDefinitionSource在acegi里面就是配置权限信息,说明哪一个url需要什么权限才能访问,acegi默认用<value>来表示,其实这正是acegi的不足之处,还好能够补救。我来说明一下:
我们知道在spring里面<value>标签比较特殊,spring首先找到这个属性的类型,然后把value里面的内容以String的类型取出来(Spring做了一下包装,为TypedString)。然后根据这个属性的类型找他的Editer,然后用Editer来处理String为需要的类型。但是我们不希望用String来表达url,很明显url里面有=就不会玩了。我们可以把这个信息写到数据库里面,然后读取,这里面不说了以前有一位高手已经解释过了。

接下来就是httpRequestAccessDecisionManager了,AccessDecisionManager在acegi里面是决策者,就是根据你所拥有的权限和访问URL需要的权限来决定你到底能不能访问。

 

代码
 1<bean id="httpRequestAccessDecisionManager"   
 2    class="org.acegisecurity.vote.AffirmativeBased">   
 3    <property name="allowIfAllAbstainDecisions">   
 4        <value>false</value>   
 5    </property>   
 6    <property name="decisionVoters">   
 7        <list>   
 8            <ref bean="roleVoter" />   
 9        </list>   
10    </property>   
11</bean>  

 

决策者里面是投票者,这个上面已经解释过了,一个投票者校验一种权限。整个流程已经说完了。

posted on 2006-12-16 22:27 常言笑 阅读(207) 评论(0)  编辑  收藏 所属分类: JAVA/J2EE


只有注册用户登录后才能发表评论。


网站导航:
 

My Links

Blog Stats

常用链接

留言簿(5)

随笔分类

随笔档案

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜