好吧,我承认取的标题太笼统了,有点哗众取宠的嫌疑了。
首先说明,本篇要讨论的是对FilterSecurityInterceptor的扩展。
FilterSecurityInterceptor用于对所有URL资源进行拦截,并施加有效地访问控制。但是在实际当中,很多应用(包括springside)在使用Acegi的时候都扩展了FilterSecurityInterceptor,理由是资源和权限的关系配置在XML中,显得不灵活,无法修改。
我们首先看下一个关于FilterSecurityInterceptor的例子:
<bean id="filterSecurityInterceptor"
class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
...
<property name="objectDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/secure/admin/* = ROLE_ADMIN
/secure/app/* = ROLE_USER
</value>
</property>
</bean>
以上例子出自Spring Acegi Tutorial,在这个例子中
资源和权限的对应关系是配置在objectDefinitionSource属性中,我们注意例子中把权限的名字以ROLE打头(很多例子中都是),其实有点误导人,这种命名容易让人产生一个误会:objectDefinitionSource里保存的是资源角色的对应关系:而如果真是这样,首先资源角色不好配置(不是一一对应),并且一旦配置后角色就固定了,在应用中就无法修改了。而有趣的是,不知道是否真的都受到了这个名字的影响,我们发现,目前网上基本所有对FilterSecurityInterceptor的扩展都是去获取资源角色的关系,扩展后它们的关系不用配置在XML中,可以去数据库中读取,但是这就不得不在修改角色的时候还要重新去查一次它们的关系。
所以我就很搞不清楚的一个问题是,为什么会这么关心角色这个对象?角色实际上只是起到连接用户和权限的作用,我们真正关心的不应该是它。如果我们在FilterSecurityInterceptor的objectDefinitionSource属性中配置资源权限的列表,并且在认证过程中获得用户拥有的权限信息,那么一切不是都简单了很多了吗?
如果说这里的资源就是一个URL,所谓的权限实际上也就是一个随便叫的字符串。只要它和URL资源一一对应就可以了,我们这样设计表:
在认证过程中我们通过四张表的关联把用户和权限的关系给找出来:
<bean id="jdbcDaoImpl"
class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
...
<property name="authoritiesByUsernameQuery">
<value>
SELECT u.USER_NAME,a.AUTHORITY_NAME
FROM TUSER u,TUSER_ROLE t,TROLE_AUTHORITY r,TAUTHORITY a
WHERE u.ID =t.USER_ID AND r.ROLE_ID=t.ROLE_ID AND a.ID=r.AUTHORITY_id AND u.USER_NAME = ?
</value>
</property>
</bean>
然后我们在FilterSecurityInterceptor的属性objectDefinitionSource中保存资源和权限得对应关系:
<bean id="filterSecurityInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
...
<property name="objectDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/secure/admin/* = auth_1
/secure/app/* = auth_2
</value>
</property>
</bean>
这样由于objectDefinitionSource保存的是资源权限的关系,对角色的修改是不会影响到他的。所以我觉得FilterSecurityInterceptor是没有必要修改的,只要在使用的时候变通下就行了。而且我在做项目的时候也不觉的把资源权限的关系配置在XML中有多不灵活,所有数据我直接从数据库里导出来,复制粘贴下就好了~
如果有人觉得关联四张表很萎缩的话,还可以把权限名给冗余到角色权限关联表中去,这样就可以少关联一张表。
分享到:
相关推荐
acegi,acegi,acegi
Acegi安全框架简介及实用扩展,spring acegi 权限管理
不错的ACEGI 教程
Acegi文档 spring acegi 详细文档
基于spring的Acegi安全框架认证与授权的分析及扩展.pdf
Acegi能做什么 Acegi的体系结构 Acegi核心组件 典型的web认证过程 Acegi的登陆认证 Acegi对安全对象的访问控制 Filter 组件 Acegi的不足之处
acegi 框架 介绍 spring 安全
1、一个Acegi的例子,可以运行 2、一个很好的学Acegi的网址,0基础学习Acegi,强烈推荐 3、有什么问题可以发邮件heroshen@126.com讨论
acegi例子,包含lib文件,可在myeclipse6.0.1下直接运行通过。
acegi-security 1.0.2.jar
包含acegi-security-1.0.7.jar,acegi-security-1.0.7-sources.jar,acegi-security-cas-1.0.7.jar,acegi-security-cas-1.0.7-sources.jar,acegi-security-catalina-1.0.7.jar,acegi-security-catalina-1.0.7-...
acegi,spring的安全验证框架
关于Acegi的安全框架,里面有Acegi的实例,讲述得挺清楚的,
Acegi安全系统,是一个用于Spring Framework的安全框架,能够和目前流行的Web容器无缝集成。它使用了Spring的方式提供了安全和认证安全服务,包括使用Bean Context,拦截器和面向接口的编程方式。因此,Acegi安全...
Acegi使用.pdf
Acegi安全系统,是一个用于Spring Framework的安全框架,能够和目前流行的Web容器无缝集成。它使用了Spring的方式提供了安全和认证安全服务,包括使用Bean Context,拦截器和面向接口的编程方式。因此,Acegi安全...
spring acegi 使用工程demo
实战Acegi:使用Acegi作为基于Spring框架的WEB应
Acegi学习笔记--Acegi详解Acegi学习笔记--Acegi详解Acegi学习笔记--Acegi详解Acegi学习笔记--Acegi详解Acegi学习笔记--Acegi详解