討論下對Acegi的擴展

好吧,我承認取的標題太籠統了,有點譁衆取寵的嫌疑了。
首先說明,本篇要討論的是對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,在這個例子中[b][size=large]資源和權限的對應關係[/size][/b]是配置在objectDefinitionSource屬性中,我們注意例子中把權限的名字以ROLE打頭(很多例子中都是),其實有點誤導人,這種命名容易讓人產生一個誤會:objectDefinitionSource裏保存的是資源角色的對應關係:而如果真是這樣,首先資源角色不好配置(不是一一對應),並且一旦配置后角色就固定了,在應用中就無法修改了。而有趣的是,不知道是否真的都受到了這個名字的影響,我們發現,目前網上基本所有對FilterSecurityInterceptor的擴展都是去獲取資源角色的關係,擴展後它們的關係不用配置在XML中,可以去數據庫中讀取,但是這就不得不在修改角色的時候還要重新去查一次它們的關係。

所以我就很搞不清楚的一個問題是,爲什麼會這麼關心角色這個對象?角色實際上只是起到連接用戶和權限的作用,我們真正關心的不應該是它。如果我們在FilterSecurityInterceptor的objectDefinitionSource屬性中配置資源權限的列表,並且在認證過程中獲得用戶擁有的權限信息,那麼一切不是都簡單了很多了嗎?
如果說這裏的資源就是一個URL,所謂的權限實際上也就是一個隨便叫的字符串。只要它和URL資源一一對應就可以了,我們這樣設計表:

[img]http://hiphotos.baidu.com/shaomengyang/pic/item/c5e4a747097f907e500ffef1.jpg[/img]
在認證過程中我們通過四張表的關聯把用戶和權限的關係給找出來:

<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中有多不靈活,所有數據我直接從數據庫裏導出來,複製粘貼下就好了~

如果有人覺得關聯四張表很萎縮的話,還可以把權限名給冗餘到角色權限關聯表中去,這樣就可以少關聯一張表。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章