shiro按钮配置标签报错问题
问题:
最近的项目需要将按钮也动态配置进去。我按照网上的步骤加上shiro的taglib标签
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
然后在该页面的某个按钮上加上
<shiro:hasPermission name="user_authorize"><button id="user_limits">用户授权</button></shiro:hasPermission>
并且后台的方法里边也有如下操作
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
User user = (User)principals.getPrimaryPrincipal();
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
List<SysFunc> sysFuncList = sysFuncService.selectSysFuncByUserName(user.getUserName()); //获取所有按钮的功能记录
if(sysFuncList != null){
Set<String> permissonSet = new HashSet<String>();
for(SysFunc func:sysFuncList){
if(!StringUtils.isEmpty(func.getFunc_Url())){
permissonSet.add(func.getFunc_Url());
};
} //如下,我也将当前用户有的按钮权限字符串放进去了。
info.setStringPermissions(permissonSet);
}
return info;
}
但是我在这么配置好之后,一点击那个jsp页面就报
UnavailableSecurityManagerException: No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton. This is an invalid application configuration.
从字面上来看,好像我没有配置securityManager的东西,但是!!!!,我登录是没有问题的。问题如下:
既然其他页面是可以的,那为什么一配置上这个标签就报错呢,网上有说过滤器的顺序原因,还有说是少配置了DispatcherType,但我并没有其他过滤器,也试过多配置几个dispatcherType,都不行。
问题最终原因:
最后发现问题出在jsp页面上,上图我们的系统左边的树,那些用户管理、组织机构对应的页面,全部是直接点击访问的jsp页面,并没有经过controller那样返回给它,而我的shiro配置因为当初为了减少静态资源的过滤,而把所有带“.”的文件统统放开了,所以jsp页面在不登录也是可以访问的,这就导致在点击带shiro标签页面的时候,它在去调用权限验证方法的时候,就会报错,也就是上边的错误。
解决方法:
具体办法有两种:
1、一种是最容易想到的,就是将这些页面点击事件,从直接访问jsp页面变成访问接口,通过接口返回jsp页面。但是现在项目已经快结束,每个jsp页面都给写一个controller,我就疯了,当然在开始的话是可以这么搞的。
2、一种是最简单的,就是既然jsp不在shiro管理下,那想办法把它管理起来不就可以了嘛。
首先找到你的shiroFilter配置的位置,我的是spring boot项目,spring boot项目是在shiroConfig类里,是下图这样:
在shiroFilter配置有MShiroFilterFactoryBean类,进入到这个类里,你可能不叫这个名字,但肯定会有这么一个配置
进入到这个类中,添加如下变量
同样在该类中的最下边:
上图定义了一个开关,是用来,判断当前请求的带“.”的url中,是不是jsp,如果是jsp则走shiro的过滤,如果不是,则不走。
如上配置以后,再重启项目后,就不会有这个错误了。这个错误影响我好几天。唉,没想到是这个原因。。。