Ralasafe開源有段時(shí)間了,大約有2個(gè)月了。根據(jù)社區(qū)的反饋,我打算圍繞Ralasafe最佳實(shí)踐,書寫一系列BLOG。
?
大體內(nèi)容有:
1, 登錄控制: 哪些頁面需要登錄后才能訪問,登錄用戶名、密碼驗(yàn)證,登錄轉(zhuǎn)向頁面;
2, URL權(quán)限控制:哪些頁面訪問需要進(jìn)行角色權(quán)限驗(yàn)證,怎樣驗(yàn)證最簡(jiǎn)單有效,如何處理驗(yàn)證失敗情況;
3, 數(shù)據(jù)級(jí)權(quán)限管理方案探討:選擇中間件呢還是框架?
4, Ralasafe體系結(jié)構(gòu): 用戶怎么讀取,用戶有哪些字段,怎樣與應(yīng)用基礎(chǔ);
5, 數(shù)據(jù)級(jí)查詢權(quán)限管理: 如何給不同的人分配不同的查詢數(shù)據(jù)權(quán)限,返回where條件呢,還是直接返回結(jié)果集?
6, 數(shù)據(jù)級(jí)決策權(quán)限管理: 如何給不同的人分配不同的數(shù)據(jù)操作權(quán)限,當(dāng)用戶不具備權(quán)限怎么辦?
7, 其他細(xì)小的權(quán)限控制: 如下拉框顯示內(nèi)容;按鈕、鏈接是否顯示,圖片是否顯示等。
-------------------------------------------- ------- --------------------------------
?
數(shù)據(jù)級(jí)權(quán)限
數(shù)據(jù)級(jí)權(quán)限,無外乎這些類型:
1,數(shù)據(jù)庫行列級(jí):比如領(lǐng)導(dǎo)查詢數(shù)據(jù)范圍和普通員工查詢的數(shù)據(jù)范圍不同,客戶經(jīng)理能夠查詢客戶聯(lián)系方式字段,而其他人不能查看客戶聯(lián)系方式字段。
2,字段內(nèi)容控制:比如普通審查員審查50w以下財(cái)務(wù)數(shù)據(jù),剛?cè)肼毧蛻艚?jīng)理只能將客戶級(jí)別調(diào)整不能超過3級(jí)。
?
從用戶與數(shù)據(jù)的交互方向可以分為2大類:
1,從系統(tǒng)獲取數(shù)據(jù)(查詢);
2,向系統(tǒng)提交數(shù)據(jù)之前的判斷。
現(xiàn)實(shí)困惑
這種權(quán)限與業(yè)務(wù)緊密耦合,很難找到通用方法。絕大部分系統(tǒng)仍然采用if/else來編程,而且這種邏輯分散到系統(tǒng)的各個(gè)環(huán)節(jié),甚至還會(huì)在系統(tǒng)多處出現(xiàn)重復(fù)判斷。
也有不少網(wǎng)友嘗試5表模型等,試圖通過數(shù)據(jù)模型構(gòu)造好的ACCESS CONTROL LIST來控制。這種構(gòu)造ENTRY模式,當(dāng)數(shù)據(jù)量小的時(shí)候,是可行的,維護(hù)工作量也不大。當(dāng)數(shù)據(jù)量大的時(shí)候,顯然不能奏效。甚至無法運(yùn)行,維護(hù)工作量非常大。
主要表現(xiàn)在:
1,where 語句里面的in(..., ..., ..., ..., ...) 子條件過長(zhǎng),或者使用in (select ... from ACL_ENTRY where ... )性能也是非常低下的;
2,當(dāng)刪除某用戶的時(shí)候,需要在ACL_ENTRY表里面,刪除相關(guān)記錄;
3,當(dāng)刪除某業(yè)務(wù)數(shù)據(jù)的時(shí)候,也需要在ACL_ENTRY表里面,刪除掉相關(guān)記錄;
4,數(shù)據(jù)量大,ACL_ENTRY數(shù)據(jù)量承幾何級(jí)增長(zhǎng)。
?
也有企業(yè)嘗試使用規(guī)則引擎來解決。這是非常好的嘗試,提升了系統(tǒng)開發(fā)效率、組件復(fù)用率。
主要表現(xiàn)在:
1,首先,主動(dòng)的實(shí)踐了一項(xiàng)最佳項(xiàng)目實(shí)踐:權(quán)限與業(yè)務(wù)松耦合。
2,通過松耦合,大幅優(yōu)化了系統(tǒng)結(jié)構(gòu)。
3,進(jìn)一步提高了組件復(fù)用率。
只是,規(guī)則引擎畢竟不是專業(yè)于權(quán)限管理領(lǐng)域,對(duì)于復(fù)雜需求,或者有些需求實(shí)現(xiàn)起來還是很別扭。看起來像if/else的規(guī)則表達(dá)罷了。
?
Ralasafe和IBM、Oracle商業(yè)產(chǎn)品一樣,都使用規(guī)則進(jìn)行描述。大家的區(qū)別在于:誰滿足需求更多、更容易了。
框架or中間件
框架的好處,顯然是有個(gè)體系結(jié)構(gòu),團(tuán)隊(duì)遵循該方式進(jìn)行開發(fā)、組裝即可。提供了一種標(biāo)準(zhǔn)和開發(fā)模式。
中間件的好處,顯然是提供了自由,而且易于結(jié)合、易于分工。提供了一種服務(wù)方式。
?
我本人希望自由,所以討厭框架,偏愛中間件。但我對(duì)選用中間件、框架的選擇標(biāo)準(zhǔn)是非常中肯的,供大家參考。
在系統(tǒng)功能分離的場(chǎng)景,適合使用中間件。
Ralasafe體系結(jié)構(gòu)及應(yīng)用集成
Ralasafe是中間件,采用服務(wù)模型。在業(yè)務(wù)需要的地方,調(diào)用Ralasafe接口,或者將Ralasafe接口向LOG4J那樣wrap到你的aspect里面去。
?
Ralasafe按照權(quán)限的方向,提供2種數(shù)據(jù)級(jí)權(quán)限管理服務(wù),也正好對(duì)應(yīng)2個(gè)接口:
1,從系統(tǒng)獲取數(shù)據(jù), Ralasafe.query( int privilegeId, User user, CustomizedWhere where, int fromIndex, int size );
2,向系統(tǒng)提交數(shù)據(jù)之前的判斷,Ralasafe.permit( int privilegeId, User user, Object businessData);
Ralasafe還針對(duì)web應(yīng)用,提供了WebRalasafe。
?
接口非常簡(jiǎn)單,在接口層只要告知Ralasafe:當(dāng)前這個(gè)是誰,他/她想干什么。
權(quán)限邏輯,全部在Ralasafe圖形化管理界面,點(diǎn)擊鼠標(biāo)完成配置,并進(jìn)行在線測(cè)試。無需編程。
所以,使用Ralasafe編程工作量非常少。也給不少開發(fā)人員造成“不知道怎樣與應(yīng)用集成”的錯(cuò)覺。
Ralasafe的用戶怎么來
Ralasafe并不會(huì)給你的應(yīng)用系統(tǒng)“假定”有哪些字段。你的應(yīng)用系統(tǒng) 用戶可以由任意字段,通過XML文件安裝到Ralasafe即可。該XML文件,主要指明:用戶存在那張表(也可以是視圖,這樣可以從多張表關(guān)聯(lián)讀取數(shù) 據(jù)。比如ralasafe-demo,就關(guān)聯(lián)到company表讀取了companyLevel和companyName字段); 哪些字段是唯一字段; 哪些字段是主鍵;各字段對(duì)應(yīng)類型。
?
然后,在所有權(quán)限規(guī)則里面,可以讀取這些用戶字段。比如ralasafe-demo應(yīng)用(下載地址:
http://www.ralasafe.org/zh/download/download.jsp?) 用戶含有companyLevel字段,在定制“總公司”用戶分類的時(shí)候,就將該用戶companyLevel字段與總公司級(jí)別“1”進(jìn)行比較。
?
(下期真正開始探討數(shù)據(jù)級(jí)權(quán)限管理實(shí)現(xiàn)了)
注:ralasafe團(tuán)隊(duì)博客在javaeye/baidu/blogjava等空間,同步發(fā)布。ralasafe官方網(wǎng)站: http://www.ralasafe.org/zh