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

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

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

    隨筆-11  評(píng)論-16  文章-1  trackbacks-0

    第二章 登錄及 URL攔截

     

     

    本章講解如何控制用戶登錄,如何攔截 URL 進(jìn)行權(quán)限驗(yàn)證。

     

    通常,項(xiàng)目有這樣的需求:

     

    1. 某些頁(yè)面沒(méi)有登錄可以查看;
    2. 某些頁(yè)面必須登錄才能查看,如果沒(méi)有登錄,轉(zhuǎn)移到登錄頁(yè)面,成功登錄后再轉(zhuǎn)移回來(lái);
    3. 某些頁(yè)面必須驗(yàn)證當(dāng)前登錄用戶是否具有請(qǐng)求該頁(yè)面的權(quán)限,如果沒(méi)有轉(zhuǎn)移到權(quán)限不足提示界面。

     

    解決思路

    控制登錄

    控制用戶登錄,采用 Filter 機(jī)制,不妨給該 Filter 起名為 LoginFilter 。

    怎樣控制哪些頁(yè)面驗(yàn)證是否登錄,哪些又不需要呢?配置 web.xml , filter 元素的 url-pattern 屬性就可以了。

    如:

    Xml代碼 
    1. <filter-mapping>  
    2.               <filter-name>LoginFilter</filter-name>  
    3.               <url-pattern>/secretDir/*</url-pattern>  
    4. </filter-mapping>  
    5.   
    6. <filter-mapping>  
    7.               <filter-name>LoginFilter</filter-name>  
    8.               <url-pattern>/anotherDir/secretDir/*</url-pattern>  
    9. </filter-mapping>  
     

     

     

    LoginFilter 檢查 session 是否有用戶,如果沒(méi)有轉(zhuǎn)移到登錄頁(yè)面;否則繼續(xù)執(zhí)行。

    偽代碼如下:

    Java代碼 
    1. if( session.getAttribute( “user” )==null ) {  
    2.        // 將用戶期望請(qǐng)求頁(yè)面保存到session,供用戶登錄成功后,自動(dòng)跳轉(zhuǎn)使用  
    3.        String requestUrl=…;  
    4.        session.setAttribute( “requestUrl”, requestUrl );   
    5.   
    6.        // 轉(zhuǎn)移到登錄界面  
    7.        redirect( loginPage, request, response );  
    8.        return;  
    9. }  
    10.   
    11. filter.doChain( request, response );  
     

     

     

    LoginFilter 還可以更進(jìn)一步,處理用戶提交用戶名和密碼后驗(yàn)證。只要告訴 LoginFilter 用戶名是哪個(gè) parameter name ,密碼是哪個(gè)parameter name ,密碼采用了什么加密算法,就可以了。

    偽代碼如下:

    Java代碼 
    1. String username=request.getParameter( usernameParameterName );  
    2. String password=request.getParameter( passwordParameterName );  
    3. String secretPassword=encrypt(encryptMethod, password );  
    4.    
    5.   
    6. User user=userManager.checkUser( username, secretPassword );  
    7. if( user==null ) {  
    8.        // 驗(yàn)證不通過(guò),繼續(xù)轉(zhuǎn)移到登錄界面  
    9.        redirect( loginPage, request, response );  
    10. else {  
    11.        // 驗(yàn)證通過(guò),將用戶保存到session,然后繼續(xù)處理  
    12.        session.removeAttribute( “requestUrl” );  
    13.        session.setAttribute( “user”, user );  
    14.        filter.doChain( request, response );  
    15. }  
     

     

     

    細(xì)心的朋友,會(huì)問(wèn)轉(zhuǎn)移到原來(lái)期望請(qǐng)求的頁(yè)面,怎么沒(méi)有看到邏輯呢?

    是的,可以在該 filter 里面 redirect 。但我更傾向于在登錄界面的 action 做處理。偽代碼如下:

    Html代碼 
    1. <%  
    2. String url=defaultLoginPage;  
    3. String requestUrl= (String)session.getAttribute( “requestUrl” );  
    4. if(requestUrl!=null ) {  
    5.     urlrequestUrl;  
    6. }  
    7. %>  
    8. <form method=”post” action=”<%=url%>>  
    9. …  
    10. </form>  
     

     

    攔截 url 做權(quán)限判斷

    對(duì)于 web 系統(tǒng),權(quán)限表有這么幾個(gè)字段:標(biāo)識(shí)、名稱、描述、對(duì)應(yīng) url 。

    那么對(duì)于 url 請(qǐng)求,可以在權(quán)限表進(jìn)行查找,查看該 url 是否有個(gè)對(duì)應(yīng)的權(quán)限。如果有,說(shuō)明該 url 需要具有沒(méi)個(gè)權(quán)限才能訪問(wèn),那么通過(guò) RBAC 算法進(jìn)行判斷即可。如果在權(quán)限表沒(méi)有找到對(duì)應(yīng)記錄,說(shuō)明該 url 不需要進(jìn)行權(quán)限驗(yàn)證。

     

    該需求比較簡(jiǎn)單,也可以采用 Filter 機(jī)制,不妨取名 UrlAclFilter 。

     

    唯一需要注意的地方是:權(quán)限表對(duì)應(yīng)的 url 可能帶有參數(shù)。比如 customreManager?op=add 是增加客戶權(quán)限, customerManager?op=delete 是刪除客戶權(quán)限。

     

    偽代碼如下:

    Java代碼 
    1. if( needPrivilegeCheck( request ) ) {  
    2.     // 需要做權(quán)限判斷  
    3.     if( session.getAttribute( “user” ) ==null ) {  
    4.         // 用戶還沒(méi)有登錄,轉(zhuǎn)移到登錄界面  
    5.         redirect( loginPage, request, response );  
    6.         return;  
    7.     } else {  
    8.         if( userManager.hasPrivilege( user, privilegeId ) ) {  
    9.             filter.doChain( request, response );  
    10.             return;  
    11.         } else {  
    12.             redirect( forbiddenHintPage, request, response );  
    13.             return;  
    14.         }  
    15.     }  
    16. }  
     

     

    基礎(chǔ)數(shù)據(jù)庫(kù)表

    用戶信息表,保存用戶信息還有密碼等,有的系統(tǒng)會(huì)對(duì)密碼進(jìn)行加密保存到數(shù)據(jù)庫(kù),而不是以明文的形式保存到數(shù)據(jù)庫(kù)。

     

    權(quán)限表,該表基本有這么幾個(gè)字段:標(biāo)識(shí)、名稱、描述、指向 url 、 target 。 target 表示點(diǎn)擊該 Url 時(shí)在那個(gè)窗口顯示。標(biāo)識(shí)為主鍵。

    比如下圖所示 frameset ,權(quán)限菜單 target 屬性應(yīng)該是: MAIN

    角色表,該表字段:標(biāo)識(shí)、名稱、描述;標(biāo)識(shí)為主鍵。

    權(quán)限-角色關(guān)系表,該表有字段:角色標(biāo)識(shí)、權(quán)限標(biāo)識(shí);角色標(biāo)識(shí)和權(quán)限標(biāo)識(shí)為復(fù)合主鍵。

    用戶-角色關(guān)系表,該表有字段:用戶標(biāo)識(shí)、角色標(biāo)識(shí);用戶標(biāo)識(shí)和角色標(biāo)識(shí)為復(fù)合主鍵。

     

    如果使用 Metadmin

    使用 Metadmin ,只要在 web.xml 里面,配置 LoginFilter 和 UrlAclFilter 即可。

    (在 www.metadmin.com, 免費(fèi)下載90天試用版)

    下面就是一個(gè)示例配置,對(duì) metadmin/demo 目錄進(jìn)行登錄和 url 攔截權(quán)限驗(yàn)證,登錄頁(yè)面是 metadmin/demo/login.jsp 頁(yè)面。

    具體參數(shù)意義可查看 JAVADOC : http://www.metadmin.com/doc/javadoc/index.html LoginFilter 和 UrlAclFilter 。

     

    配置示例:

    Xml代碼 
    1.       <filter>  
    2.     <filter-name>metadmin/LoginFilter</filter-name>  
    3.     <filter-class>org.back.webFilter.LoginFilter</filter-class>  
    4.     <init-param>  
    5.         <param-name>loginPage</param-name>  
    6.         <param-value>/metadmin/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>  
    21. <filter>  
    22.     <filter-name>metadmin/UrlAclFilter</filter-name>  
    23.     <filter-class>org.back.webFilter.UrlAclFilter</filter-class>  
    24.     <init-param>  
    25.         <param-name>loginPage</param-name>  
    26.         <param-value>/metadmin/demo/login.jsp</param-value>  
    27.     </init-param>  
    28.     <init-param>  
    29.         <param-name>denyPage</param-name>  
    30.         <param-value>/metadmin/demo/noPrivilege.jsp</param-value>  
    31.     </init-param>  
    32. </filter>  
    33.   
    34.      <filter-mapping>  
    35.     <filter-name>metadmin/LoginFilter</filter-name>  
    36.     <url-pattern>/metadmin/demo/*</url-pattern>  
    37. </filter-mapping>  
    38. <filter-mapping>  
    39.     <filter-name>metadmin/UrlAclFilter</filter-name>  
    40.     <url-pattern>/metadmin/demo/*</url-pattern>  
    41. </filter-mapping>  
     

     

    posted on 2009-06-16 15:39 細(xì)粒度權(quán)限管理 閱讀(3011) 評(píng)論(4)  編輯  收藏

    評(píng)論:
    # re: 《玩轉(zhuǎn)細(xì)粒度權(quán)限管理》 二,登錄及URL攔截 2009-06-17 00:42 | 心夢(mèng)帆影
    細(xì)精度權(quán)限管理,這個(gè)主題不錯(cuò),支持一下.  回復(fù)  更多評(píng)論
      
    # re: 《玩轉(zhuǎn)細(xì)粒度權(quán)限管理》 二,登錄及URL攔截 2009-06-17 08:12 | 細(xì)粒度權(quán)限管理
    @心夢(mèng)帆影
    謝謝支持!還會(huì)有后繼文章的。歡迎關(guān)注!  回復(fù)  更多評(píng)論
      
    # re: 《玩轉(zhuǎn)細(xì)粒度權(quán)限管理》 二,登錄及URL攔截[未登錄](méi) 2009-06-17 11:08 | Sniper
    關(guān)注中!  回復(fù)  更多評(píng)論
      
    # re: 《玩轉(zhuǎn)細(xì)粒度權(quán)限管理》 二,登錄及URL攔截 2009-06-23 10:03 | 找個(gè)美女做老婆
    Java樂(lè)園技術(shù)交流,http://www.javaly.cn
    2群群號(hào):28840096  回復(fù)  更多評(píng)論
      

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久久精品亚洲AV久久久无码| 久久久青草青青国产亚洲免观 | 222www在线观看免费| 亚洲乱色熟女一区二区三区丝袜| 一本到卡二卡三卡免费高| 免费在线观看理论片| 免费看一级高潮毛片| 亚洲精品国产精品国自产观看| 美女视频免费看一区二区| 亚洲国产91精品无码专区| 曰批全过程免费视频免费看| 亚洲国产人成精品| 香港一级毛片免费看| 亚洲精品无码激情AV| a级毛片在线免费观看| 亚洲综合一区二区国产精品| 永久在线免费观看| ASS亚洲熟妇毛茸茸PICS| 在线观着免费观看国产黄| 全黄A免费一级毛片| 久久夜色精品国产亚洲| 99在线热视频只有精品免费| 亚洲中文字幕一二三四区苍井空| 午夜男人一级毛片免费| 黄色a三级三级三级免费看| 亚洲日本va中文字幕久久| 日韩精品无码一区二区三区免费| 亚洲中文无码av永久| 国产三级免费电影| 97人妻精品全国免费视频| 亚洲AV无码一区二区三区在线| 国产jizzjizz视频全部免费| 国内精品免费视频精选在线观看 | 蜜桃成人无码区免费视频网站 | 久久久久国色AV免费观看性色| 理论亚洲区美一区二区三区| 国产亚洲精品a在线观看app| 成年人网站在线免费观看| 国产VA免费精品高清在线| 亚洲女人18毛片水真多| 亚洲av高清在线观看一区二区 |