今天發現一個問題:使用shiro的時候,雖然隐藏掉了一些菜單,但是當我們通過get請求直接通路菜單的時候還是會通路到,也就是shiro可以在界面實作隐藏一些資訊,但是沒有真正的根據權限碼驗證請求,于是自己在背景實作驗證。
需求:有權限(權限碼是systemmanager:settings)的人可以點選系統設定跳轉到系統設定頁面,沒權限的人看不到菜單,但是通過get通路可以通路到,于是需要在背景攔截。
實作思路:在需要精确驗證的方法開始先驗證權限,如果驗證成功啥也不做,驗證失敗的話就抛出一個沒有權限的異常。在攔截器中捕捉到異常就記錄日志,并傳回到提醒頁面。
解釋:
(1)Subject currentUser = SecurityUtils.getSubject(); 先擷取到Subject,
(2)boolean permitted = currentUser.isPermitted(permission); 然後驗證權限
(3)如果驗證失敗就記錄日志,(擷取到subject中的principal,principal其實是認證的時候裝進SimpleAuthenticationInfo的user對象)
Object principal = currentUser.getPrincipal();
if (principal instanceof User) {
User user = (User) principal;
log.error("user {} no permission !", user.getUsername());
}
throw new NoPermissionException("no permission ");
認證時候裝進去的User對象:---principal
必須繼承RuntimeException,運作時異常不需要在抛出異常的時候顯示的捕捉或者聲明(throws.....),如果繼承Exception為檢查異常,需要捕捉或者throws聲明.
方法開始先驗證權限,但是沒有捕捉異常,如果驗證失敗異常會抛出在攔截器中被捕捉。
捕捉到NoPermissionException異常就傳回noPermissionError在全局結果集中處理
傳回值是noPermissionError跳轉到noPermissionError.jsp頁面
給出沒權限提醒。
至此,完成了背景驗證,也就是在所有方法開始先驗證權限。
還有另一種辦法就是自定義注解實作權限驗證,有點類似于shiro自帶的注解驗證權限,參考:https://www.cnblogs.com/qlqwjy/p/7257616.html
【當你用心寫完每一篇部落格之後,你會發現它比你用代碼實作功能更有成就感!】