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(資源)和權限表示方式不規范。
