<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Terry.Li-彬

    虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

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

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

    ?

    大體內容有:

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

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

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

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

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

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

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

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

    ?

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

    ?

    需求考察

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

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

    解決方案

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

    實例說明

    OK,我們套個實例說話!就拿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 > ??

    ?

    ?這里有幾個屬性上面沒有提到。uniqueFieldsParams表示頁面的哪些字段可以唯一確定用戶,一般情況下只有一個參數。這里配置是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" > ??

    ?

    ?如果需要多個字段確定一個用戶,比如需要用戶名+機構唯一確定,那么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表示頁面哪個字段是密碼字段;encryptMethod表示密碼使用什么加密方法,ralasafe提供了base64,md5hex,shahex加密方法。你也可以自行開發加密方法,詳見LoginFilter javadoc

    ?

    哪些頁面需要登錄驗證

    我們只要將需要驗證的頁面,安裝該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資源都需要經過LoginFilter過濾。

    驗證邏輯

    驗證邏輯全部在LoginFilter里面。LoginFilter主要做這些事情:

    ?

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

    登錄頁面轉向

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

    此時,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年開始的),所以很難更好地站在使用者角度(雖然,我們在努力,一直在努力),內容肯定有欠缺和錯誤。歡迎大家提出寶貴建議,歡迎大家努力拍磚!

    我們也將繼續保持開源,為大家貢獻好的軟件。也懇請大家支持我們!

    ?

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

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

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

    評論

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


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

    網站導航:
     
    主站蜘蛛池模板: 亚洲Av无码乱码在线播放| 国产一区二区三区在线观看免费| 亚洲人成伊人成综合网久久久 | 无限动漫网在线观看免费| 亚洲综合久久久久久中文字幕| 日韩免费无码视频一区二区三区| 亚洲人成电影在在线观看网色| **毛片免费观看久久精品| 亚洲国产成人综合| 成人黄18免费视频| 国产午夜亚洲精品不卡免下载| 亚洲AV无码不卡在线观看下载| 国产精品成人啪精品视频免费| 亚洲精品无码久久久久sm| 日日麻批免费40分钟无码| 亚洲视频一区在线观看| 思思99re66在线精品免费观看| 亚洲国产成人久久一区二区三区 | 日韩免费高清大片在线| 亚洲国产精品成人久久久| 久久精品网站免费观看| 爱情岛论坛免费视频| 亚洲成AV人片在线观看无| 一级女人18毛片免费| 国产精品亚洲专区无码不卡| 国产日产亚洲系列| 国产高清免费视频| 羞羞视频免费网站入口| 亚洲国产国产综合一区首页| 毛片a级三毛片免费播放| 一个人看www免费高清字幕| 亚洲影院在线观看| 免费黄色大片网站| 日韩av无码免费播放| 亚洲中文字幕久久精品无码VA| 亚洲欧洲日产国码高潮αv| 在线a免费观看最新网站| 污污视频网站免费观看| 精品亚洲成AV人在线观看| 国产国产成年年人免费看片| 无码精品国产一区二区三区免费|