1. 程式人生 > >秒極啊!手把手帶你進行shiro授權攔截器的重寫,學到了學到了

秒極啊!手把手帶你進行shiro授權攔截器的重寫,學到了學到了

## shiro整合前後端分離的springboots,Vue專案真的是有很多大坑啊。 ## 今天我的主題是:如何設定shiro過濾器。 遇到問題:我的專案是前後端分離的,shiro裡面有一個shiroFilterFactoryBean.setUnauthorizedUrl(“你自己的url”); 函式 ![](https://upload-images.jianshu.io/upload_images/23140115-6965afae4f52f812.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 這是什麼意思呢:這表示如果你訪問了一個需要許可權的url,但是目前你登陸的角色沒有許可權,那麼頁面預設跳轉的地址。 看著似乎是沒啥毛病。 **但是!!!** 如果是前後端分離怎麼辦呢?後端shiro讓專案跳向前端某個頁面,這裡是前後端分離式的啊!當前端的使用者(沒許可權)傳送了一個請求被shiro直接攔截了,前端一臉懵不知道發生什麼問題了,所以傻傻的在控制檯返回一段紅色的跨域錯誤資訊。 那麼我們應該怎麼解決呢? 你肯定會想那就讓後端讓前端跳轉啊,這裡我要說,既然是前後端分離的話,後端只能給前端傳送資訊讓前端根據返回的資訊自行處理。 但是問題又來了,shiro這玩意直接把前端請求攔截了啥都不返回,啥都不說一聲,搞的前端還誤解是跨域問題。 **那麼我們就應該去改寫shiro的攔截器,讓它處理方式更人性化。** ## 不廢話了,開始主題 開始改寫攔截器: ![](https://upload-images.jianshu.io/upload_images/23140115-a66e6d3e6a63b786?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ``` //package com.igeekhome.ccs.tool.config; //寫自己的當前目錄 import lombok.SneakyThrows; import org.apache.shiro.subject.Subject; import org.apache.shiro.web.filter.authz.AuthorizationFilter; import org.springframework.boot.configurationprocessor.json.JSONObject; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import java.io.IOException; import java.io.PrintWriter; public class MyPermsFilter extends AuthorizationFilter { @Override protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception { System.out.println("isAccessDenied"); Subject subject = getSubject(request, response); String[] rolesArray = (String[]) mappedValue; System.out.println("subject:"+subject.getPrincipal()); if (rolesArray == null || rolesArray.length == 0) { //no roles specified, so nothing to check - allow access. return true; } for(i