Terry.Li-彬

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

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

          Ralasafe開源有段時間了,大約有2個月了。根據(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)容;按鈕、鏈接是否顯示,圖片是否顯示等。

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

          ?

          今天說的URL權(quán)限控制,內(nèi)容主要有:URL權(quán)限控制,當(dāng)用戶訪問某URL時,進(jìn)行角色權(quán)限驗(yàn)證。如果有相應(yīng)權(quán)限,則允許其正常訪問;否則,轉(zhuǎn)到拒絕頁面。

          我們依然通過一個Filter來實(shí)現(xiàn),這樣就無需在代碼中增加權(quán)限判斷,也無需套用任何框架。對于整個權(quán)限管理系統(tǒng)來說,本節(jié)內(nèi)容也非常簡單

          理論分析

          當(dāng)軟件實(shí)施人員進(jìn)行系統(tǒng)實(shí)施的時候,會將一些訪問菜單定義為權(quán)限。然后定義角色,讓角色擁有權(quán)限。然后再將權(quán)限賦給用戶。

          所以,當(dāng)用戶請求某個URL的時候,要不該URL需要權(quán)限驗(yàn)證,要不就是不需要權(quán)限驗(yàn)證。

          檢驗(yàn)標(biāo)準(zhǔn)就是:看權(quán)限表里面有沒有該URL。檢驗(yàn)的時候,唯一需要注意的是:URL參數(shù),比如employeeManage?op=add。

          數(shù)據(jù)庫模型

          權(quán)限表:id<int>,name<varchar>,url<varchar>,description<varchar> ? | pk(id)

          角色表:id<int>,name<varchar>,description<varchar> ? ? ? ? ? ? ? ? ? ? ? ?| pk(id)

          角色-權(quán)限關(guān)系表:roleId<int>,privilegeId<int> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | pk(roleId,privilegeId)

          用戶-角色關(guān)系表:userId<int>(根據(jù)你系統(tǒng)的情況,也可能是varchar等),roleId<int> | pk(userId,roleId)

          Ralasafe方案

          Ralasafe權(quán)限管理中間件(下載地址),既可以管理和控制功能級權(quán)限,也可以管理和控制數(shù)據(jù)級權(quán)限。開發(fā)者還可以根據(jù)需求,只選擇功能級控制,或者只選擇數(shù)據(jù)級控制。

          ?

          當(dāng)安裝好用戶元數(shù)據(jù)的時候,Ralasafe自動創(chuàng)建所有權(quán)限表。相關(guān)權(quán)限數(shù)據(jù),都由Ralasafe界面進(jìn)行管理(即錄入)。

          ?

          Ralasafe的管理界面,在功能權(quán)限方面可以做到:

          1,管理權(quán)限界面;

          2,管理角色界面,并給角色賦權(quán)限;

          3,給用戶分配角色界面。這里還需要注意:不同用戶管理可以給不同范圍的用戶分配角色。比如:總公司的管理員可以給所有人分配角色;分公司管理員可以給本分公司及下屬子公司用戶分配角色。

          ?

          Ralasafe將最后一點(diǎn)視為數(shù)據(jù)級權(quán)限。詳見:http://www.ralasafe.org/zh/guide/reference/safe.html#ralasafe?和

          http://www.ralasafe.org/jforum/posts/list/11.page

          ?

          org.ralasafe.webFilter.UrlAclFilter配置到web.xml即可,而且配置工作量極其少。

          ?

          Xml代碼
          1. < filter > ??
          2. ????<filter-name>ralasafe/UrlAclFilter</filter-name>??
          3. ????<filter-class>org.ralasafe.webFilter.UrlAclFilter</filter-class>??
          4. ????<init-param>??
          5. ????????<param-name>loginPage</param-name>??
          6. ????????<param-value>/ralasafe/demo/login.jsp</param-value>??
          7. ????</init-param>??
          8. ????<init-param>??
          9. ????????<param-name>denyPage</param-name>??
          10. ????????<param-value>/ralasafe/demo/noPrivilege.jsp</param-value>??
          11. ????</init-param>??
          12. </ filter > ??
          13. < filter-mapping > ??
          14. ????<filter-name>ralasafe/UrlAclFilter</filter-name>??
          15. ????<url-pattern>/ralasafe/demo/*</url-pattern>??
          16. </ filter-mapping > ??
          ?

          ?

          該Filter具有這些功能:

          1,在用戶具有權(quán)限的時候,正常訪問;

          2,在用戶不具有權(quán)限的時候,轉(zhuǎn)到拒絕頁面;

          3,如果用戶沒用登錄,轉(zhuǎn)到登錄頁面,讓用戶先登錄。

          其他

          這里我簡單說說spring security。

          spring security在控制功能權(quán)限的時候,還會幫助開發(fā)人員控制Dao/Service等組件。我個人認(rèn)為這種控制是多余的。

          因?yàn)椋δ軝?quán)限控制應(yīng)該站在最終用戶角度進(jìn)行考慮。Dao/Service等編程開發(fā)級的組件,并不是最終用戶關(guān)心的事情。所以無需進(jìn)行功能權(quán)限控制。

          另外,大家在使用spring security,我建議將功能級權(quán)限控制放在數(shù)據(jù)庫里面,而不是annotation到j(luò)ava code里面。因?yàn)閍nnotation到j(luò)ava code里面,最終用戶就不能控制了。

          ?

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

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

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

          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 恩施市| 德化县| 开封市| 乡城县| 谷城县| 天门市| 凤城市| 普定县| 长治市| 万宁市| 射阳县| 安徽省| 石首市| 正镶白旗| 石景山区| 互助| 右玉县| 响水县| 长白| 和平区| 江北区| 大港区| 潜江市| 淮阳县| 广水市| 东宁县| 黔东| 尚义县| 浑源县| 册亨县| 陆河县| 桐城市| 新巴尔虎左旗| 丰顺县| 福建省| 山东省| 寿光市| 汝州市| 怀集县| 中山市| 伊川县|