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)容;按鈕、鏈接是否顯示,圖片是否顯示等。

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

          ?

          今天說的登錄控制,內(nèi)容主要有:哪些頁面需要登錄控制、登錄驗(yàn)證邏輯、登 錄后頁面轉(zhuǎn)向哪里,以及權(quán)限菜單等問題。雖然本系列講解權(quán)限管理,尤其是數(shù)據(jù)級權(quán)限管理。但嚴(yán)格意義來說,登錄控制,并不屬于權(quán)限管理內(nèi)容。它屬于用戶身 份認(rèn)證內(nèi)容。權(quán)限基本都與用戶相關(guān),用戶首先就涉及到用戶名密碼驗(yàn)證。所以我們從這里開始說起。

          ?

          需求考察

          仔細(xì)考察登錄控制,無外乎這些需求:

          1. 哪些頁面需要登錄后才能查看,而且哪些頁面還需要進(jìn)一步驗(yàn)證角色權(quán)限;
          2. 登錄頁面在哪里?
          3. 登錄用戶名、密碼驗(yàn)證;
          4. 登錄后轉(zhuǎn)向哪個(gè)頁面?
          分析清楚需求后,我們來考察使用什么方案,以其達(dá)到目標(biāo):將共用與個(gè)性的東西分開,而且盡可能共同,個(gè)性的東西盡可能使用配置方式。

          解決方案

          Ralasafe解決方案:
          1. 登錄界面和登錄轉(zhuǎn)向后頁面,由開發(fā)人員編寫,這屬于個(gè)性化內(nèi)容,有CSS、頁面布局等;
          2. 哪些頁面需要登錄才能查看,可以通過Filter來控制:哪些頁面需要控制,使用web.xml里面的url-pattern,是否登錄使用Filter驗(yàn)證session;
          3. 哪些頁面還需要進(jìn)行角色權(quán)限驗(yàn)證,這個(gè)我們拆分出去,做為功能權(quán)限驗(yàn)證,以后再談;
          4. 用戶名、密碼驗(yàn)證可以共用:就是從request中讀取用戶名、密碼值,或許可能還要對密碼進(jìn)行加密,然后與數(shù)據(jù)庫用戶表相關(guān)字段進(jìn)行比對。
          5. 登錄后頁面轉(zhuǎn)向:通過給session添加一個(gè)gotoPage屬性,驗(yàn)證成功后轉(zhuǎn)向該頁面即可。

          實(shí)例說明

          OK,我們套個(gè)實(shí)例說話!就拿ralasafe-demo來說,下載地址:http://ralasafe.org/zh/download/download.jsp
          ralasafe/demo里面的頁面需要登錄后才能訪問,ralasafe/demo/login.jsp頁面是登錄頁面;ralasafe/demo/main.jsp是登錄后,顯示功能菜單的頁面。

          ?

          配置LoginFilter

          我們先將LoginFilter配置到web.xml文件:

          ?

          Xml代碼
          1. < filter > ??
          2. ????<filter-name>ralasafe/LoginFilter</filter-name>??
          3. ????<filter-class>org.ralasafe.webFilter.LoginFilter</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>uniqueFieldsParams</param-name>??
          10. ????????<param-value>loginName</param-value>??
          11. ????</init-param>??
          12. ????<init-param>??
          13. ????????<param-name>passwordParam</param-name>??
          14. ????????<param-value>password</param-value>??
          15. ????</init-param>??
          16. ????<!--init-param>??
          17. ????????<param-name>encryptMethod</param-name>??
          18. ????????<param-value>shahex</param-value>??
          19. ????</init-param-->??
          20. </ filter > ??

          ?

          ?這里有幾個(gè)屬性上面沒有提到。uniqueFieldsParams表示頁面的哪些字段可以唯一確定用戶,一般情況下只有一個(gè)參數(shù)。這里配置是loginName(Login頁面的字段input name屬性),那么login.jsp里面就有這樣的代碼:

          ?

          Html代碼
          1. < input ? name =" < span ?style=" color :?rgb(255,?0,?0);" > < strong > loginName </ strong > </ span > "? type = "text" ? class = "username" > ??

          ?

          ?如果需要多個(gè)字段確定一個(gè)用戶,比如需要用戶名+機(jī)構(gòu)唯一確定,那么web.xml可以配置成:

          ?

          Xml代碼
          1. < init-param > ??
          2. ????<param-name>uniqueFieldsParams</param-name>??
          3. ????<param-value>loginName,<span?style="color:?rgb(255,?0,?0);"><strong>unitId</strong></span></param-value>??
          4. </ init-param > ??

          ?passwordParam表示頁面哪個(gè)字段是密碼字段;encryptMethod表示密碼使用什么加密方法,ralasafe提供了base64,md5hex,shahex加密方法。你也可以自行開發(fā)加密方法,詳見LoginFilter javadoc

          ?

          哪些頁面需要登錄驗(yàn)證

          我們只要將需要驗(yàn)證的頁面,安裝該Filter即可。配置web.xml:

          ?

          Xml代碼
          1. < filter-mapping > ??
          2. ????<filter-name>ralasafe/LoginFilter</filter-name>??
          3. ????<url-pattern>/ralasafe/demo/*</url-pattern>??
          4. </ filter-mapping > ??

          表示ralasafe/demo下的所有URL資源都需要經(jīng)過LoginFilter過濾。

          驗(yàn)證邏輯

          驗(yàn)證邏輯全部在LoginFilter里面。LoginFilter主要做這些事情:

          ?

          1. 首先判斷客戶端是否在請求登錄頁面,如果是,那么轉(zhuǎn)向登錄頁面,以免造成死循環(huán)
          2. 然后如果是請求登錄,那么讀取用戶名、密碼(可能密碼還要加密)進(jìn)行驗(yàn)證;
          3. 如果不是請求登錄,那么這時(shí)需要查看session用戶是否登錄了。如果沒有登錄,那么轉(zhuǎn)到登錄頁面;如果已經(jīng)登錄繼續(xù)doChain。
          細(xì)心的朋友會(huì)問,怎樣去后臺(tái)驗(yàn)證用戶名密碼呢?
          Ralasafe是通過配置元數(shù)據(jù)(詳見這里),來告訴系統(tǒng)哪張表是用戶表,哪些字段是用戶唯一字段(和LoginFilter里里面的uniqueFieldsParams順序?qū)?yīng)上即可,無需名稱相同)。
          LoginFilter字段指明哪個(gè)字段是密碼字段,LoginFilter還需要指明和用戶表的哪個(gè)字段進(jìn)行比較。也就是userPasswordField參數(shù)意義。詳見: LoginFilter javadoc

          登錄頁面轉(zhuǎn)向

          如果客戶端在沒有登錄的情況下,請求/ralasafe/demo/employMng路徑,那么登錄成功后,系統(tǒng)最好直接轉(zhuǎn)到該路徑。 LoginFilter會(huì)將該路徑采集下來,以“gotoPage”屬性保存到session。登陸成功后,會(huì)移除掉該屬性(不占用session資源)。

          此時(shí),LoginFilter的form action是這么編寫的:

          ?

          Html代碼
          1. < %??
          2. ????String?gotoPage?=?(String)?session.getAttribute("gotoPage");??
          3. ????if?(StringUtil.isEmpty(gotoPage))?{??
          4. ????????gotoPage?=?"main.jsp";??
          5. ????}??
          6. ?%>??
          7. < form ? name = "" ? action = "<%=gotoPage%>" ? method = "post" > ??

          ?

          至此,我相信一切你都明白了。?

          ?

          ------------------------分隔線----------------------------

          畢竟我們搞ralasafe很多年了(04年開始的),所以很難更好地站在使用者角度(雖然,我們在努力,一直在努力),內(nèi)容肯定有欠缺和錯(cuò)誤。歡迎大家提出寶貴建議,歡迎大家努力拍磚!

          我們也將繼續(xù)保持開源,為大家貢獻(xiàn)好的軟件。也懇請大家支持我們!

          ?

          注:下期講解?2, URL權(quán)限控制:哪些頁面訪問需要進(jìn)行角色權(quán)限驗(yàn)證,怎樣驗(yàn)證最簡單有效,如何處理驗(yàn)證失敗情況;

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

          posted on 2010-09-11 11:10 禮物 閱讀(867) 評論(1)  編輯  收藏

          評論

          # 354554 2015-06-30 15:27 3498665
          684854986  回復(fù)  更多評論
            


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

          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 旺苍县| 苍山县| 宽城| 德庆县| 泗水县| 时尚| 寿光市| 吐鲁番市| 固原市| 清徐县| 大方县| 边坝县| 普安县| 丹凤县| 平山县| 石景山区| 永济市| 亚东县| 宜城市| 宿州市| 威宁| 遂溪县| 哈尔滨市| 黎城县| 天柱县| 盘锦市| 昌都县| 溧水县| 巫山县| 鸡泽县| 龙海市| 西昌市| 阿尔山市| 盐边县| 同心县| 安国市| 友谊县| 赣榆县| 萍乡市| 大田县| 峡江县|