由于shiro1.6.0版本出现了安全漏洞,于是进行了版本的升级,升级到1.71.版本,但遇到了以下问题:
1、访问某个接口的时候,返回状态码400,invaild request;
2、访问路径为XX/XXX/{params}。XXX包含中文
找到问题所在
1、先找到是哪个地方报的400
2、看1.6.X和1.7.X版本该类的区别
1.6.X
1.7.X
从图片可以看出,1.6.X只校验了uri = WebUtils.toHttp(request).getRequestURI(),但是1.7.X还校验了路径 request.getPathInfo(),且进行了解码得到路径,路径中有中文,就校验不通过
解决办法:
创建一个自定义类
public class CustomShiroFilterFactoryBean extends ShiroFilterFactoryBean {
@Override
protected FilterChainManager createFilterChainManager() {
FilterChainManager manager = super.createFilterChainManager();
Map<String, Filter> filterMap = manager.getFilters();
Filter invalidRequestFilter = filterMap.get(DefaultFilter.invalidRequest.name());
if (invalidRequestFilter instanceof InvalidRequestFilter) {
//此处是关键,设置false跳过URL携带中文400,servletPath中文校验
((InvalidRequestFilter) invalidRequestFilter).setBlockNonAscii(false);
}
return manager;
}
}
在shiroConfig中getShiroFilterFactoryBean中引入CustomShiroFilterFactoryBean
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager securityManager) {
CustomShiroFilterFactoryBean shiroFilterFactoryBean =new CustomShiroFilterFactoryBean();
//设置安全管理器
shiroFilterFactoryBean.setSecurityManager(securityManager);
/*
* 添加shiro内置过滤器,实现权限相关的url拦截
* 常见过滤器:
* anon:无需认证(登录)可以访问
* authc:必须认证才可以访问
* user:如果使用Remember Me的功能,可以直接访问
* perms:该资源必须得到资源权限才可以访问
* role:该资源必须得到角色权限才可以访问
*/
Map<String, String> filterMap = new LinkedHashMap<>();
filterMap.put("/add", "authc");
filterMap.put("/update", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
return shiroFilterFactoryBean;
}