Acegi 的擴充套件

2021-03-31 11:28:51 字數 1977 閱讀 1673

年剛過,還很懶,這個東東年前都開始關注了,今天把學習成果總結一下。

acegi,乙個安全系統,***和面向介面的程式設計方式,支援acl、jaas基於spring.我的理解其價值在於:replace container-managed authentication,將安全這一塊脫離具體j2ee容器,將來需要遷移時少一些麻煩,它足夠強大,可以給web系統甚至cs應用提供足夠的安全保護機制。這是乙個常用的輪子,造得不錯喲。

不過,acegi的學習曲線很陡峭,在web.xml配置了一堆的filter之後,還需要配置spring的bean,仍然是一堆,好在先跑起了demo(0.6.1 quick-start)增加了一點信心。

2 accessdecissionmanager 用於授權乙個特定的操作,這裡有乙個授權策略問題,三個實現類分別為:

affirmativebased 只需有乙個投票贊成即可通過(最常用);allowifallabstaindecisions屬性值預設為false,意思是如果所有的授權投票是都是棄權,則通不過授權檢查。

consensusbased 需要大多數投票贊成即可通過;

unanimousbased 需要所有的投票贊成才能通過(悲觀吧)。

3 objectdefinitionsource 描述角色與資源的匹配方式。

以上三個bean裝配成為乙個filterinvocationinterceptor,它將用來組裝securityenforcementfilter,之後的bean先不考慮了,因為擴充套件時用不到,照抄即可。

例子是比較簡易的,要想讓應用在實際專案中,首先需要解決以下兩個問題:

1 基於資料庫的使用者認證,一般是使用者名稱+密碼,我的作法是:

1.1 使你的user(pojo或domain object)實現acegi中的這個介面:userdetails,當然,如果你不想這麼作,也可以加乙個中間層,包裝一下啦。

這個介面只有乙個方法 public grantedauthority getauthorities();即返回該使用者的角色列表.

1.2 自己實現這個介面passwordauthenticationdao,不管你用hibernate還是ibatis.

public userdetails loaduserbyusernameandpassword(string username, string password);

很明顯,需要從資料庫中驗證使用者名稱和口令。

1.3 開始裝配:

2 例子中url和角色的匹配關係也是固定的,如下:

convert_url_to_lowercase_before_***parison

pattern_type_apache_ant

/admin/**=role_admin

/contract.do*=role_***

如果這一塊也需要從database中取,可以這麼來實現:新建乙個類extending pathbasedfilterinvocationdefinitionmap,

使用其addsecureurl來增加匹配資訊。我寫的是乙個超簡單的類,只為說明問題:

package ***.head.acegisecurity;

import ***.sf.acegisecurity.intercept.web.pathbasedfilterinvocationdefinitionmap;

import ***.sf.acegisecurity.configattributedefinition;

import ***.sf.acegisecurity.configattribute;

public class cjobjectdefinitionsource extends

pathbasedfilterinvocationdefinitionmap

class myconfigattribute implements configattribute}}

然後配置:

最後,再說一下,acegi確實是乙個優秀的安全框架,靈活強大,即使你用不上它,也可以從它的設計中汲取靈感。

acegi的認證過程

authenticationmanager是認證核心介面,其作用是驗證客戶端輸入端使用者名稱是否正確 這個介面只有乙個方法 code public authentication authenticate authentication authentication throws authenticat...

Acegi 01 Acegi安全系統介紹

1acegi安全系統介紹 acegi始於 2003年晚期,當時在spring developers郵件列表中有人提問是否有人考慮提供乙個基於spring的安全實現。當時,srping的社群是相對比較小的 尤其是和今天相比!實際上spring本身也是2003年早期才作為乙個sourceforge專案出...

acegi中的cache配置

通過讀acegi的原始碼,更加體會到 基於介面 的設計給擴充套件帶來巨大的靈活性。在bean配置中,有以下內容 這個usercache,acegi給出了乙個預設的ehcache的實現,如果你不設該屬性,預設使用nullusercache,使用者登入後,每進入乙個url,系統都會通過dao訪問一次資料...