shiro-5基於url的權限管理


1.1 搭建環境

1.1.1 數據庫

 

mysql5.1數據庫中創建表:用戶表、角色表、權限表(實質上是權限和資源的結合 )、用戶角色表、角色權限表。

    

完成權限管理的數據模型創建。

    

1.1.2 開發環境

jdk1.7.0_72

eclipse 3.7 indigo 

技術架構:springmvc+mybatis+jquery easyui

 

1.1.3 系統工程架構

springmvc+mybatis+jquery easyui

    

 

1.1.4 系統登陸

 

系統 登陸相當 於用戶身份認證,用戶成功,要在session中記錄用戶的身份信息.

 

操作流程:

用戶進行登陸頁面

輸入用戶名和密碼進行登陸

進行用戶名和密碼校驗

如果校驗通過,在session記錄用戶身份信息

 

1.1.1.1 用戶的身份信息

 

創建專門類用於記錄用戶身份信息。

    

 

1.1.1.2 mapper

 

mapper接口: 根據用戶賬號查詢用戶(sys_user)信息(使用逆向工程生成的mapper

使用逆向工程生成以下表的基礎代碼:

    

 

1.1.1.3 service(進行用戶名和密碼校驗)

 

接口功能:根據用戶的身份和密碼 進行認證,如果認證通過,返回用戶身份信息

認證過程:

根據用戶身份(賬號)查詢數據庫,如果查詢不到用戶不存在

對輸入的密碼 和數據庫密碼 進行比對,如果一致,認證通過

     

 

 

1.1.1.4 controller(記錄session

    

 

1.1.1 用戶認證攔截器

 

1.1.1.1 anonymousURL.properties

 

配置可以匿名訪問的url

    

 

1.1.1.2 編寫認證攔截器

//用於用戶認證校驗、用戶權限校驗
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
//得到請求的url
String url = request.getRequestURI();
//判斷是否是公開 地址
//實際開發中需要公開 地址配置在配置文件中
//從配置中取逆名訪問url
List<String> open_urls = ResourcesUtil.gekeyList("anonymousURL");
//遍歷公開 地址,如果是公開 地址則放行
for(String open_url:open_urls){
if(url.indexOf(open_url)>=0){
//如果是公開 地址則放行
return true;
}
}
//判斷用戶身份在session中是否存在
HttpSession session = request.getSession();
ActiveUser activeUser = (ActiveUser) session.getAttribute("activeUser");
//如果用戶身份在session中存在放行
if(activeUser!=null){
return true;
}
//執行到這里攔截,跳轉到登陸頁面,用戶進行身份認證
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
//如果返回false表示攔截不繼續執行handler,如果返回true表示放行
return false;
}

 

1.1.1.3 配置攔截器

 

springmvc.xml中配置攔截器

     

 

1.1.2 授權

 

 

 

1.1.2.1 commonURL.properties

 

在此配置文件配置公用訪問地址,公用訪問地址只要通過用戶認證,不需要對公用訪問地址分配權限即可訪問。

 

1.1.2.2 獲取用戶權限范圍的菜單

 

思路:

 

在用戶認證時,認證通過,根據用戶id從數據庫獲取用戶權限范圍的菜單,將菜單的集合存儲在session中。

    

 

mapper接口:根據用戶id查詢用戶權限的菜單

    

service接口:根據用戶id查詢用戶權限的菜單

    

 

1.1.2.3 獲取用戶權限范圍的url

 

 

 

思路:

 

在用戶認證時,認證通過,根據用戶id從數據庫獲取用戶權限范圍的url,將url的集合存儲在session中。

    

mapper接口:根據用戶id查詢用戶權限的url

    

    

service接口:根據用戶id查詢用戶權限的url

    

 

1.1.2.4 用戶認證通過取出菜單和url放入session

  

修改service認證代碼:

    

 

1.1.2.5 菜單動態顯示

 

修改first.jsp,動態從session中取出菜單顯示:

    

 

1.1.2.6 授權攔截器

    

//在執行handler之前來執行的
    //用於用戶認證校驗、用戶權限校驗
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        
        //得到請求的url
        String url = request.getRequestURI();
        
        //判斷是否是公開 地址
        //實際開發中需要公開 地址配置在配置文件中
        //從配置中取逆名訪問url
        
        List<String> open_urls = ResourcesUtil.gekeyList("anonymousURL");
        //遍歷公開 地址,如果是公開 地址則放行
        for(String open_url:open_urls){
            if(url.indexOf(open_url)>=0){
                //如果是公開 地址則放行
                return true;
            }
        }
        
        //從配置文件中獲取公共訪問地址
        List<String> common_urls = ResourcesUtil.gekeyList("commonURL");
        //遍歷公用 地址,如果是公用 地址則放行
        for(String common_url:common_urls){
            if(url.indexOf(common_url)>=0){
                //如果是公開 地址則放行
                return true;
            }
        }
        
        //獲取session
        HttpSession session = request.getSession();
        ActiveUser activeUser = (ActiveUser) session.getAttribute("activeUser");
        //從session中取權限范圍的url
        List<SysPermission> permissions = activeUser.getPermissions();
        for(SysPermission sysPermission:permissions){
            //權限的url
            String permission_url = sysPermission.getUrl();
            if(url.indexOf(permission_url)>=0){
                //如果是權限的url 地址則放行
                return true;
            }
        }
        
        //執行到這里攔截,跳轉到無權訪問的提示頁面
        request.getRequestDispatcher("/WEB-INF/jsp/refuse.jsp").forward(request, response);
        
        //如果返回false表示攔截不繼續執行handler,如果返回true表示放行
        return false;
    }

 

1.1.2.7 配置授權攔截器

注意:將授權攔截器配置在用戶認證攔截的下邊。

    

1.1 小結

只保護到菜單,頁面里面的 操作沒有權限管控,那么有人直接在瀏覽器輸入這個地址即可進入這個頁面。

使用基於url攔截的權限管理方式,實現起來比較簡單,不依賴框架不用spring的攔截器也可以,使用web提供filter就可以實現。目前也是基於資源,但是不夠細。

問題:

需要將所有的url全部配置起來,有些繁瑣,不易維護,url(資源)和權限表示方式不規范。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM