隨筆-11  評(píng)論-16  文章-1  trackbacks-0
          -------------------------------------------- 總大綱 --------------------------------------
          Ralasafe是基于MIT協(xié)議開(kāi)源的,數(shù)據(jù)級(jí)權(quán)限管理中間件。開(kāi)源有段時(shí)間了,大約有2個(gè)月了。根據(jù)社區(qū)的反饋,我打算圍繞Ralasafe最佳實(shí)踐,書(shū)寫(xiě)一系列BLOG。
           
          大體內(nèi)容有:
          1, 登錄控制: 哪些頁(yè)面需要登錄后才能訪問(wèn),登錄用戶(hù)名、密碼驗(yàn)證,登錄轉(zhuǎn)向頁(yè)面;
          2, URL權(quán)限控制:哪些頁(yè)面訪問(wèn)需要進(jìn)行角色權(quán)限驗(yàn)證,怎樣驗(yàn)證最簡(jiǎn)單有效,如何處理驗(yàn)證失敗情況;
          3, 數(shù)據(jù)級(jí)權(quán)限管理方案探討:選擇中間件呢還是框架?
          4, Ralasafe體系結(jié)構(gòu): 用戶(hù)怎么讀取,用戶(hù)有哪些字段,怎樣與應(yīng)用基礎(chǔ);
          5, 數(shù)據(jù)級(jí)查詢(xún)權(quán)限管理: 如何給不同的人分配不同的查詢(xún)數(shù)據(jù)權(quán)限,返回where條件呢,還是直接返回結(jié)果集?
          6, 數(shù)據(jù)級(jí)決策權(quán)限管理: 如何給不同的人分配不同的數(shù)據(jù)操作權(quán)限,當(dāng)用戶(hù)不具備權(quán)限怎么辦?
          7, 其他細(xì)小的權(quán)限控制: 如下拉框顯示內(nèi)容;按鈕、鏈接是否顯示,圖片是否顯示等。
          -------------------------------------------- ------- --------------------------------------
           
          今天說(shuō)的登錄控制,內(nèi)容主要有:哪些頁(yè)面需要登錄控制、登錄驗(yàn)證邏輯、登錄后頁(yè)面轉(zhuǎn)向哪里,以及權(quán)限菜單等問(wèn)題。雖然本系列講解權(quán)限管理,尤其是數(shù)據(jù)級(jí)權(quán)限管理。但嚴(yán)格意義來(lái)說(shuō),登錄控制,并不屬于權(quán)限管理內(nèi)容。它屬于用戶(hù)身份認(rèn)證內(nèi)容。權(quán)限基本都與用戶(hù)相關(guān),用戶(hù)首先就涉及到用戶(hù)名密碼驗(yàn)證。所以我們從這里開(kāi)始說(shuō)起。
           
          需求考察

          仔細(xì)考察登錄控制,無(wú)外乎這些需求:
          1,哪些頁(yè)面需要登錄后才能查看,而且哪些頁(yè)面還需要進(jìn)一步驗(yàn)證角色權(quán)限;
          2,登錄頁(yè)面在哪里?
          3,登錄用戶(hù)名、密碼驗(yàn)證;
          4,登錄后轉(zhuǎn)向哪個(gè)頁(yè)面?

          分析清楚需求后,我們來(lái)考察使用什么方案,以其達(dá)到目標(biāo):將共用與個(gè)性的東西分開(kāi),而且盡可能共同,個(gè)性的東西盡可能使用配置方式。

          解決方案

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

          實(shí)例說(shuō)明

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

          配置LoginFilter


          我們先將LoginFilter配置到web.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è)屬性上面沒(méi)有提到。uniqueFieldsParams表示頁(yè)面的哪些字段可以唯一確定用戶(hù),一般情況下只有一個(gè)參數(shù)。這里配置是loginName(Login頁(yè)面的字段input name屬性),那么login.jsp里面就有這樣的代碼:
          <input name="loginName" type="text" class="username"> 

          如果需要多個(gè)字段確定一個(gè)用戶(hù),比如需要用戶(hù)名+機(jī)構(gòu)唯一確定,那么web.xml可以配置成:
          <init-param> 
              
          <param-name>uniqueFieldsParams</param-name> 
              
          <param-value>loginName,unitId</param-value> 
          </init-param> 

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

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

          我們只要將需要驗(yàn)證的頁(yè)面,安裝該Filter即可。配置web.xml:
          <filter-mapping> 
              
          <filter-name>ralasafe/LoginFilter</filter-name> 
              
          <url-pattern>/ralasafe/demo/*</url-pattern> 
          </filter-mapping>

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

          驗(yàn)證邏輯


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

          登錄頁(yè)面轉(zhuǎn)向

          如果客戶(hù)端在沒(méi)有登錄的情況下,請(qǐng)求/ralasafe/demo/employMng路徑,那么登錄成功后,系統(tǒng)最好直接轉(zhuǎn)到該路徑。LoginFilter會(huì)將該路徑采集下來(lái),以“gotoPage”屬性保存到session。登陸成功后,會(huì)移除掉該屬性(不占用session資源)。
          此時(shí),LoginFilter的form action是這么編寫(xiě)的:
          <% 
              
          String gotoPage = (String) session.getAttribute("gotoPage"); 
              
          if (StringUtil.isEmpty(gotoPage)) { 
                  gotoPage 
          = "main.jsp"
              } 
           
          %> 
          <form name="" action="<%=gotoPage%>" method="post">
           
          至此,我相信一切你都明白了。
           
          ------------------------分隔線----------------------------
          畢竟我們搞ralasafe很多年了(04年開(kāi)始的),所以很難更好地站在使用者角度(雖然,我們?cè)谂Γ恢痹谂Γ瑑?nèi)容肯定有欠缺和錯(cuò)誤。歡迎大家提出寶貴建議,歡迎大家努力拍磚!
          我們也將繼續(xù)保持開(kāi)源,為大家貢獻(xiàn)好的軟件。也懇請(qǐng)大家支持我們!
           
          注:下期講解 2, URL權(quán)限控制:哪些頁(yè)面訪問(wèn)需要進(jìn)行角色權(quán)限驗(yàn)證,怎樣驗(yàn)證最簡(jiǎn)單有效,如何處理驗(yàn)證失敗情況;
          ralasafe團(tuán)隊(duì)博客在javaeye/baidu/blogjava等空間,同步發(fā)布。ralasafe官方網(wǎng)站:http://www.ralasafe.org/zh
           
          posted on 2010-09-01 19:41 細(xì)粒度權(quán)限管理 閱讀(3722) 評(píng)論(2)  編輯  收藏

          評(píng)論:
          # re: 權(quán)限管理最佳實(shí)踐:一,登錄控制[未登錄](méi) 2010-09-06 09:32 | Neo
          關(guān)注中~~~  回復(fù)  更多評(píng)論
            
          # 讓他 2013-05-02 16:11 | 同一臺(tái)
          日月潭  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 宁陕县| 泽库县| 白城市| 武威市| 阳山县| 嘉兴市| 六枝特区| 乐平市| 石屏县| 修文县| 洛隆县| 彭阳县| 连南| 平山县| 万全县| 玛沁县| 谢通门县| 云南省| 安远县| 溧阳市| 万全县| 墨脱县| 普陀区| 榆社县| 八宿县| 屏南县| 达孜县| 于都县| 正安县| 巴马| 泌阳县| 宣威市| 承德县| 土默特右旗| 永平县| 宣武区| 抚松县| 枣阳市| 常德市| 巴东县| 商城县|