Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學(xué);靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks

          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)證最簡單有效,如何處理驗(yàn)證失敗情況;

          3, 數(shù)據(jù)級權(quán)限管理方案探討:選擇中間件呢還是框架?

          4, Ralasafe體系結(jié)構(gòu): 用戶怎么讀取,用戶有哪些字段,怎樣與應(yīng)用基礎(chǔ);

          5, 數(shù)據(jù)級查詢權(quán)限管理: 如何給不同的人分配不同的查詢數(shù)據(jù)權(quán)限,返回where條件呢,還是直接返回結(jié)果集?

          6, 數(shù)據(jù)級決策權(quán)限管理: 如何給不同的人分配不同的數(shù)據(jù)操作權(quán)限,當(dāng)用戶不具備權(quán)限怎么辦?

          7, 其他細(xì)小的權(quán)限控制: 如下拉框顯示內(nèi)容;按鈕、鏈接是否顯示,圖片是否顯示等。

          -------------------------------------------- ------- --------------------------------

          ?

          ?

          數(shù)據(jù)級權(quán)限管理需求

          數(shù)據(jù)級權(quán)限管理需求主要有:

          1,支持不同用戶查詢到數(shù)據(jù)是不同的;

          2,支持?jǐn)?shù)據(jù)庫行級、列級查詢;

          3,支持分頁查詢——包括2個(gè)方面:a,分頁查出數(shù)據(jù);b,能告知總數(shù)據(jù)條數(shù)是多少;

          4,支持自定義條件(比如:張三在自己的查詢權(quán)限范圍內(nèi),查詢50w以上的訂單)。

          理論分析

          能夠?qū)?shù)據(jù)級權(quán)限,與業(yè)務(wù)分離出來——是多年來開發(fā)人員追求的目標(biāo)。一旦遇到疑難雜癥,馬上會讓人聯(lián)想到高難度的API編程,或者絢麗的XML配置。

          ?

          不過,我今天的分析,會極其簡單。不過我強(qiáng)烈建議大家看下去。如果對該方案有所懷疑,請使用你的應(yīng)用案例進(jìn)行試驗(yàn)。我當(dāng)時(shí)不敢確認(rèn)的時(shí)候,就是這么做的。

          (當(dāng)初,我提出該方案的時(shí)候,我們團(tuán)隊(duì)認(rèn)為該方案過于簡單,不可行。我堅(jiān)持讓他們實(shí)現(xiàn)該方案。等產(chǎn)品做出來后,他們略有所悟,認(rèn)為該方案可行。當(dāng),我讓他們做demo的時(shí)候,將該方案運(yùn)用于案例的時(shí)候,他們拍腿叫道:超級太棒了!我希望你也有該感受)

          ?

          分類思想的提出

          首先,我們思考這個(gè)問題:為什么我們在程序里面使用了if/else?為什么數(shù)據(jù)級權(quán)限難以處理?

          原因就是:1,有很多種情況;2,我們需要針對不同的人、不同的情況做不同的權(quán)限邏輯。比如:

          Java代碼
          1. if ??是總公司用戶???then?查詢所有訂單;??
          2. else ? if ??是分公司用戶???then?查詢本分公司(${用戶的公司})及下屬子公司訂單;??
          3. else ? //??是子公司用戶了 ??
          4. then?查詢本子公司訂單(${用戶的公司})??

          ?

          在RBAC模型里面有用戶群組概念,也有不少開發(fā)人員將用戶群組引入數(shù)據(jù)級權(quán)限管理領(lǐng)域。群組很好的將用戶歸組,但不足之處是要事先將用戶歸入組內(nèi)。比如,在將張三指定到“總公司用戶組”之前,他不屬于該用戶組,即便張三的機(jī)構(gòu)屬性顯示他屬于總公司。

          我們對群組進(jìn)行稍微改造:使用規(guī)則來定義群組,滿足該規(guī)則的用戶,我們則 認(rèn)為該用戶屬于該群組。傳統(tǒng)編程里面的if/else判斷條件,基本都可以使用規(guī)則或者規(guī)則表達(dá)式組來描述。此時(shí),張三的機(jī)構(gòu)屬性顯示是總公司,那么他就 屬于總公司用戶組;如果他的機(jī)構(gòu)屬性是某個(gè)分公司,那么他就屬于分公司用戶組了。無需進(jìn)行額外操作(指定、重新指派等,一切都是動態(tài)智能的)。

          ?

          OK,至此,我們提出了使用規(guī)則描述的“用戶分類”。該規(guī)則應(yīng)該能讀取用戶信息、上下文信息、數(shù)據(jù)查詢等,并進(jìn)行相關(guān)運(yùn)算(比較、集合運(yùn)算等)

          ?

          至此,我們可以基于用戶要分類,為每個(gè)用戶分類分配一個(gè)查詢。(該查詢可以接受相關(guān)參數(shù),比如用戶參數(shù)、上下文參數(shù)等)

          那么上述例子,使用分類思想,可以這么解決:

          用戶分類:總公司用戶類 —— 查詢:查詢所有訂單

          用戶分類:分公司用戶類 —— 查詢:查詢本分公司及下屬子公司訂單;

          用戶分類:子公司用戶類 —— 查詢:查詢本子公司訂單。

          與功能權(quán)限結(jié)合

          我認(rèn)為功能權(quán)限與數(shù)據(jù)權(quán)限分開非常合適。功能權(quán)限由企業(yè)IT管理員維護(hù);數(shù)據(jù)權(quán)限由軟件開發(fā)商維護(hù)。有人會說這樣不好,比如這個(gè)案例怎么處理:

          普通審查員可以審查50w財(cái)務(wù)數(shù)據(jù);中級審查員審查50w~500w的財(cái)務(wù)數(shù)據(jù)。這個(gè)50w、500w,企業(yè)需要自行維護(hù)。

          ?

          OK,我認(rèn)為這50w、500w應(yīng)該稱為“權(quán)限策略數(shù)據(jù)”,可以保存到數(shù)據(jù)庫里面,做為基礎(chǔ)數(shù)據(jù)或者數(shù)據(jù)字典由企業(yè)通過界面自行維護(hù)。而軟件開發(fā)商,開發(fā)的“數(shù)據(jù)級權(quán)限”策略讀取這些數(shù)據(jù)。(當(dāng)然,你可以緩存。。。。)

          Ralasafe方案

          怎樣實(shí)現(xiàn)數(shù)據(jù)級查詢權(quán)限

          為了理解本節(jié)內(nèi)容,建議下載ralasafe demo應(yīng)用,對照圖形界面,更容易理解些。

          Ralasafe使用管理界面來定制用戶分類、定制數(shù)據(jù)查詢。為了確保定制無誤,Ralasafe支持在線測試。比如定制用戶分類后,可以選擇一個(gè)用戶進(jìn)行測試。數(shù)據(jù)查詢等都是可以在線測試的。

          ?

          定制完畢后,將用戶分類和數(shù)據(jù)查詢配對,賦給特點(diǎn)權(quán)限。一個(gè)權(quán)限,可以賦多個(gè)(用戶分類——數(shù)據(jù)查詢)配對。和前面的理論分析一樣。

          ?

          具體定制,怎樣配對,可以參考文檔,配有圖片,在此不做多說。定制用戶分類定制數(shù)據(jù)查詢給權(quán)限授權(quán)策略(即配對)。

          怎樣與應(yīng)用結(jié)合

          Ralasafe提供org.ralasafe.Ralasafeorg.ralasafe.WebRalasafe兩個(gè)接口類。里面的query方法對應(yīng)數(shù)據(jù)級查詢權(quán)限。在應(yīng)用系統(tǒng)相應(yīng)的地方,調(diào)用該方法即可。我建議在系統(tǒng)的控制層調(diào)用,即:servlet或者action。

          ?

          ralasafe demo例子,EmployeServlet就是這么調(diào)用的:(demo演示員工查詢,不是訂單查詢

          Java代碼
          1. //?通過Ralasafe接口獲取當(dāng)前用戶被授權(quán)查看的員工 ??
          2. Collection?employees?=?WebRalasafe.query(req,?Privilege.QUERY_EMPLOYEE);??
          3. //?將數(shù)據(jù)放入request,供前臺展示 ??
          4. req.setAttribute("employees",?employees);??

          OK,就這么簡單。需要編程的工作量非常非常少,達(dá)到了極致。世界從此清凈了。

          ?

          (WebRalasafe.query方法接受req<HttpRequest>參數(shù),從這里讀取User。Ralasafe.query方法則直接傳入U(xiǎn)ser,可供非web類應(yīng)用調(diào)用)?

          系統(tǒng)結(jié)構(gòu)

          Ralasafe由權(quán)限引擎和管理界面組成。權(quán)限引擎解析權(quán)限策略;管理界面生成、維護(hù)權(quán)限策略。如圖示:

          ?

          ?

          注:ralasafe團(tuán)隊(duì)博客在javaeye/baidu/blogjava等空間,同步發(fā)布。ralasafe官方網(wǎng)站: http://www.ralasafe.org/zh

          posted on 2010-09-11 11:13 禮物 閱讀(775) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。

          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 梓潼县| 大城县| 嘉鱼县| 岳普湖县| 伊春市| 额敏县| 公主岭市| 华蓥市| 龙泉市| 遂平县| 凌云县| 镇巴县| 六盘水市| 沐川县| 岑溪市| 分宜县| 伊金霍洛旗| 云龙县| 防城港市| 祁门县| 海淀区| 黔江区| 南漳县| 平遥县| 日喀则市| 开封县| 民勤县| 新野县| 托里县| 诸暨市| 东兴市| 民乐县| 香河县| 高邮市| 凭祥市| 冷水江市| 托克逊县| 乳源| 汪清县| 集安市| 五常市|