shiro整合前后端分离的springboots,Vue项目真的是有很多大坑啊。
今天我的主题是:如何设置shiro过滤器。
遇到问题:我的项目是前后端分离的,shiro里面有一个shiroFilterFactoryBean.setUnauthorizedUrl(“你自己的url”);
函数
这是什么意思呢:这表示如果你访问了一个需要权限的url,但是目前你登陆的角色没有权限,那么页面默认跳转的地址。
看着似乎是没啥毛病。
但是!!!
如果是前后端分离怎么办呢?后端shiro让项目跳向前端某个页面,这里是前后端分离式的啊!当前端的用户(没权限)发送了一个请求被shiro直接拦截了,前端一脸懵不知道发生什么问题了,所以傻傻的在控制台返回一段红色的跨域错误信息。
那么我们应该怎么解决呢?
你肯定会想那就让后端让前端跳转啊,这里我要说,既然是前后端分离的话,后端只能给前端发送信息让前端根据返回的信息自行处理。
但是问题又来了,shiro这玩意直接把前端请求拦截了啥都不返回,啥都不说一声,搞的前端还误解是跨域问题。
那么我们就应该去改写shiro的拦截器,让它处理方式更人性化。
不废话了,开始主题
开始改写拦截器:
//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(int i=0;i<rolesArray.length;i++){
if(subject.isPermitted(rolesArray[i])){
System.out.println("rolealist:"+rolesArray[i]);
return true;
}
}
return false;
}
@SneakyThrows
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws IOException {
System.out.println("onAccessDenied");
Subject subject = getSubject(request, response);
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// If the subject isn't identified, redirect to login URL
if (subject.getPrincipal() == null) {
// saveRequestAndRedirectToLogin(request, response); //没登陆就进入重新登陆接口,这里前后端分离不需要
System.out.println("没登陆");
String objectStr= "{'name':'没登陆'}";
JSONObject jsonObject=new JSONObject(objectStr);
PrintWriter wirte = null;
wirte = response.getWriter();
wirte.print(jsonObject);
} else {
System.out.println("没权限");
String objectStr= "{'name':'没权限'}";