隨筆-11  評論-16  文章-1  trackbacks-0

           

          -------------------------------------------- 總大綱 ---------------------------------

          Ralasafe開源有段時間了,大約有2個月了。根據社區的反饋,我打算圍繞Ralasafe最佳實踐,書寫一系列BLOG。

           

          大體內容有:

          1, 登錄控制: 哪些頁面需要登錄后才能訪問,登錄用戶名、密碼驗證,登錄轉向頁面;

          2, URL權限控制:哪些頁面訪問需要進行角色權限驗證,怎樣驗證最簡單有效,如何處理驗證失敗情況;

          3, 數據級權限管理方案探討:選擇中間件呢還是框架?

          4, Ralasafe體系結構: 用戶怎么讀取,用戶有哪些字段,怎樣與應用基礎;

          5, 數據級查詢權限管理: 如何給不同的人分配不同的查詢數據權限,返回where條件呢,還是直接返回結果集?

          6, 數據級決策權限管理: 如何給不同的人分配不同的數據操作權限,當用戶不具備權限怎么辦?

          7, 其他細小的權限控制: 如下拉框顯示內容;按鈕、鏈接是否顯示,圖片是否顯示等。

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

           

           

          數據級權限管理需求

          數據級權限管理需求主要有:

          1,支持不同用戶查詢到數據是不同的;

          2,支持數據庫行級、列級查詢;

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

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

          理論分析

          能夠將數據級權限,與業務分離出來——是多年來開發人員追求的目標。一旦遇到疑難雜癥,馬上會讓人聯想到高難度的API編程,或者絢麗的XML配置。

           

          不過,我今天的分析,會極其簡單。不過我強烈建議大家看下去。如果對該方案有所懷疑,請使用你的應用案例進行試驗。我當時不敢確認的時候,就是這么做的。

          (當初,我提出該方案的時候,我們團隊認為該方案過于簡單,不可行。我堅持讓他們實現該方案。等產品做出來后,他們略有所悟,認為該方案可行。當,我讓他們做demo的時候,將該方案運用于案例的時候,他們拍腿叫道:超級太棒了!我希望你也有該感受)

           

          分類思想的提出

          首先,我們思考這個問題:為什么我們在程序里面使用了if/else?為什么數據級權限難以處理?

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

          if  是總公司用戶?  then 查詢所有訂單;  
          else if  是分公司用戶?  then 查詢本分公司(${用戶的公司})及下屬子公司訂單;  
          else //  是子公司用戶了  
          then 查詢本子公司訂單(${用戶的公司}) 

           

          在RBAC模型里面有用戶群組概念,也有不少開發人員將用戶群組引入數據級權限管理領域。群組很好的將用戶歸組,但不足之處是要事先將用戶歸入組內。比如,在將張三指定到“總公司用戶組”之前,他不屬于該用戶組,即便張三的機構屬性顯示他屬于總公司。

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

           

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

           

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

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

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

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

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

          與功能權限結合

          我認為功能權限與數據權限分開非常合適。功能權限由企業IT管理員維護;數據權限由軟件開發商維護。有人會說這樣不好,比如這個案例怎么處理:

          普通審查員可以審查50w財務數據;中級審查員審查50w~500w的財務數據。這個50w、500w,企業需要自行維護。

           

          OK,我認為這50w、500w應該稱為“權限策略數據”,可以保存到數據庫里面,做為基礎數據或者數據字典由企業通過界面自行維護。而軟件開發商,開發的“數據級權限”策略讀取這些數據。(當然,你可以緩存。。。。)

          Ralasafe方案

          怎樣實現數據級查詢權限

          為了理解本節內容,建議下載ralasafe demo應用,對照圖形界面,更容易理解些。

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

           

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

           

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

          怎樣與應用結合

          Ralasafe提供org.ralasafe.Ralasafeorg.ralasafe.WebRalasafe兩個接口類。里面的query方法對應數據級查詢權限。在應用系統相應的地方,調用該方法即可。我建議在系統的控制層調用,即:servlet或者action。

           

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

          // 通過Ralasafe接口獲取當前用戶被授權查看的員工  
          Collection employees = WebRalasafe.query(req, Privilege.QUERY_EMPLOYEE);  
          // 將數據放入request,供前臺展示  
          req.setAttribute("employees", employees);  

           

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

           

          (WebRalasafe.query方法接受req<HttpRequest>參數,從這里讀取User。Ralasafe.query方法則直接傳入User,可供非web類應用調用) 

          系統結構

          Ralasafe由權限引擎和管理界面組成。權限引擎解析權限策略;管理界面生成、維護權限策略。如圖示:

           

           

          注:ralasafe團隊博客在javaeye/baidu/blogjava等空間,同步發布。ralasafe官方網站:http://www.ralasafe.org/zh

           

           

           

          posted on 2010-09-08 21:38 細粒度權限管理 閱讀(4834) 評論(1)  編輯  收藏

          評論:
          # re: 權限管理最佳實踐:四,數據級查詢權限管理 2010-12-04 21:28 | yanglee
          分析的好啊
          開源萬歲  回復  更多評論
            

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


          網站導航:
           
          主站蜘蛛池模板: 平邑县| 班戈县| 铁岭县| 中宁县| 濮阳市| 松江区| 江油市| 新源县| 利川市| 花莲市| 大兴区| 蚌埠市| 乐平市| 依兰县| 鸡西市| 怀来县| 延吉市| 镇赉县| 台北县| 萨嘎县| 西乡县| 南雄市| 莒南县| 栾城县| 天等县| 钟祥市| 多伦县| 宜昌市| 左云县| 金堂县| 静乐县| 名山县| 扎鲁特旗| 德格县| 积石山| 安陆市| 汶川县| 丘北县| 临西县| 嘉善县| 九江市|