天天看點

Shiro背景實作驗證權限

  今天發現一個問題:使用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

Shiro背景實作驗證權限

   必須繼承RuntimeException,運作時異常不需要在抛出異常的時候顯示的捕捉或者聲明(throws.....),如果繼承Exception為檢查異常,需要捕捉或者throws聲明.

   方法開始先驗證權限,但是沒有捕捉異常,如果驗證失敗異常會抛出在攔截器中被捕捉。

  捕捉到NoPermissionException異常就傳回noPermissionError在全局結果集中處理

  傳回值是noPermissionError跳轉到noPermissionError.jsp頁面

  給出沒權限提醒。

Shiro背景實作驗證權限

至此,完成了背景驗證,也就是在所有方法開始先驗證權限。

還有另一種辦法就是自定義注解實作權限驗證,有點類似于shiro自帶的注解驗證權限,參考:https://www.cnblogs.com/qlqwjy/p/7257616.html

【當你用心寫完每一篇部落格之後,你會發現它比你用代碼實作功能更有成就感!】

繼續閱讀