小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

系統(tǒng)權(quán)限模塊設(shè)計(ps:有圖有真相!)

 安若婧年 2015-06-15
         在百度百科里查到了權(quán)限管理系統(tǒng)的定義:
引用
權(quán)限管理,一般指根據(jù)系統(tǒng)設(shè)置的安全規(guī)則或者安全策略,用戶可以訪問而且只能訪問自己被授權(quán)的資源,不多不少。權(quán)限管理幾乎出現(xiàn)在任何系統(tǒng)里面,只要有用戶和密碼的系統(tǒng)。

    任何一個系統(tǒng)都有對應(yīng)的權(quán)限管理模塊,比較粗糙的系統(tǒng)是在開發(fā)的時候就定義了哪些類型的用戶擁有某些權(quán)限,在開發(fā)過程中就把權(quán)限給定死了;有的則是通過模糊匹配url來進(jìn)行權(quán)限的控制,但是這些日后維護(hù)起來會比較麻煩,可能還有其他很多種方式來進(jìn)行權(quán)限的管理,但是不管通過何種方式,其目的都是為了能夠安全、靈活、方便的操作,而且還不能影響系統(tǒng)性能。

    以下是我自己開發(fā)的后臺管理系統(tǒng)的權(quán)限模塊,分享一下我設(shè)計的權(quán)限模塊的開發(fā)思路:
    后臺管理系統(tǒng)是基于Spring + struts2.0 + hibernate + Ext 3.2.1架構(gòu)開發(fā)的,因為前臺主要是以Ext為主,所以權(quán)限模塊也是在圍繞Ext樹進(jìn)行設(shè)計的。使用Ext開發(fā)過的同學(xué)都知道Ext.tree.TreePanel的節(jié)點是由Ext.tree.TreeNode定義的,其中Ext.tree.TreeNode中有個href屬性,接下來的權(quán)限控制就是圍繞這個href進(jìn)行控制的。
    先來看看數(shù)據(jù)模型:

從模型中可以看到權(quán)限表引用了菜單管理這張表,擴(kuò)展這張權(quán)限表的目的是為了更靈活的對權(quán)限進(jìn)行管理,而不單單只是圍繞菜單樹,然后通過權(quán)限關(guān)聯(lián)表進(jìn)行角色權(quán)限的維護(hù)。

    在找百度百科看看權(quán)限管理的分類
引用
權(quán)限管理分類
  從控制力度來看,可以將權(quán)限管理分為兩大類:   
1,功能級權(quán)限管理;   
2,數(shù)據(jù)級權(quán)限管理。   
    從控制方向來看,也可以將權(quán)限管理分為兩大類:   
1,從系統(tǒng)獲取數(shù)據(jù),比如查詢訂單、查詢客戶資料;   
2,向系統(tǒng)提交數(shù)據(jù),比如刪除訂單、修改客戶資料。


    接下來進(jìn)入權(quán)限模塊的開發(fā)階段,系統(tǒng)是根據(jù)角色進(jìn)行權(quán)限控制的,在用戶登入系統(tǒng)的時候,獲取用戶的角色信息,然后獲取角色的權(quán)限信息也就是URI列表保存在session中(ps:權(quán)限信息不一定保存在session中,也可以借助第三方存儲,比如:memcache),通過過濾器來進(jìn)行訪問控制(判斷請求的URI是否在列表當(dāng)中)。當(dāng)然前臺js也要保存這些URI,這樣就可以同時控制界面元素是否展現(xiàn)了。

過濾器控制:
Java代碼  收藏代碼
  1. List<String> roleAccessList = (List<String>) session.getAttribute(sessionKey);  
  2.         String URL = req.getServletPath();  
  3.         if(checkNoFilterType(URL) || checkNoFilterURI(URL) || roleAccessList.contains(URL)) {  
  4.             //如果是免過濾地址或免過濾類型則通過  
  5.             chain.doFilter(request, response);  
  6.         } else {  
  7.               
  8.             String ajaxTag = req.getHeader("Request-By");//Ext  
  9.             resp.setCharacterEncoding("UTF-8");  
  10.             resp.setContentType("text/html;charset=utf-8");  
  11.             PrintWriter out = resp.getWriter();  
  12.             if(ajaxTag == null || !ajaxTag.trim().equalsIgnoreCase("Ext")){  
  13.                 //resp.sendRedirect(this.redirectUri);  
  14.                 out.print("權(quán)限受限!");  
  15.             }else{  
  16.                 Map<String, Object> result = new HashMap<String, Object>();  
  17.                 result.put("success", false);  
  18.                 result.put("noPermission",true);  
  19.                 result.put("redirectUri", this.redirectUri);  
  20.                 out.print(Json.object2Json(result));  
  21.             }  
  22.               
  23.             out.flush();  
  24.             out.close();  
  25.         }  


前臺js控制:
Js代碼  收藏代碼
  1. P_roleAccessUris = '<%=session.getAttribute("userRoleAccessList") != null ? session.getAttribute("userRoleAccessList").toString() : ""%>';//可訪問權(quán)限uris  
  2.       
  3.     /** 
  4.     * 判斷用戶是否有uri訪問權(quán)限 
  5.     * @param url 
  6.     * @return boolean 
  7.     */  
  8.     function Pfn_enableAccess(url){  
  9.         url = url.substr(P_basePath.length);  
  10.         if(P_roleAccessUris.indexOf(url) != -1){  
  11.             return true;  
  12.         }  
  13.         return false;  
  14.     }  
  15.       
  16.     // Default headers to pass in every request  
  17.     Ext.Ajax.defaultHeaders = {  
  18.         'Request-By': 'Ext' //標(biāo)識ajax請求  
  19.     };  
  20.       
  21.     // ajax回調(diào)函數(shù)處理系統(tǒng)退出        
  22.     Ext.Ajax.on('requestcomplete',checkStatus, this);           
  23.     function checkStatus(conn,response,options){  
  24.         var json = Ext.decode(response.responseText);  
  25.         if(typeof json == 'object'   
  26.             && !json.success ){  
  27.             if(json.timeout){  
  28.                 alert("登入超時,系統(tǒng)將自動跳轉(zhuǎn)到登陸頁面,請重新登入!");  
  29.                 top.window.location.href = P_basePath + json.redirectUri;  
  30.                 return false;     
  31.             }else if(json.noPermission){  
  32.                 alert("權(quán)限受限!");  
  33.                 return false;  
  34.             }                         
  35.         }  
  36.                 
  37.     }   


最后貼些圖上來看看:

權(quán)限管理模塊:


接下來看下一普通用戶的權(quán)限信息及登入界面:
普通用戶權(quán)限信息(選中為已分配權(quán)限):

普通用戶登入界面:


補充說明:
有些同學(xué)可能沒看明白,認(rèn)為權(quán)限粒度太粗,這里我特別說明一下:控制不當(dāng)單只是用戶入口(菜單)的控制,也包括了操作控制(即包含了權(quán)限過濾器指定下的所有URL)。完全可以控制到每一個操作。   

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多