shiro框架里按钮的权限控制
上一篇文章关于用户登录退出接口的介绍
项目已分享到GitHub
上,如果需要的可以看下,springboot+shiro项目Git下载地址。
通过前几篇的文章里,写了关于数据库建表、shiro框架在springboot中的配置步骤、以及登录时的shiro验证的接口。
因为对于功能中系统
、模块
、菜单
的类型,都统一根据条件sql查询返回给前端,由前端控制起来,而剩下的操作
类型,也就是按钮,是通过shiro的标签来维护的,下面就写一下关于shiro标签的使用方法。
1、jsp页面中引入标签
在需要做按钮控制的jsp
页面中加入如下标签,最上边第二行,加上就行:
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
2、在要控制的按钮上加上如下配置
<shiro:hasPermission name="user_authorize"><button id="user_limits">用户授权</button></shiro:hasPermission>
对于上边的name
属性中的值user_authorize
其实就是一个字符串,随便起的,该功能在页面上的展示如下:
上图中当前用户下只有一个角色测试角色2
只要对该角色授权时,勾选上该按钮用户授权
这个按钮,就可以了。注意在添加该功能信息的时候,不要选错了资源类型
,一定要选为操作
类型。
3、验证的逻辑
当在jsp
中做好了上边两步以后,然后找到userRealm
类,在doGetAuthorizationInfo
方法中添加如下内容:
//表示根据用户身份获取授权信息
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
User user = (User)principals.getPrimaryPrincipal();
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
Map<String,Object> argsMap = new HashMap<String,Object>();
argsMap.put("username",user.getUsername());
argsMap.put("siteid","1");
argsMap.put("funcType","4");
List<SysFunc> sysFuncList = sysFuncService.selectSysFuncByUserName(argsMap); //获取所有按钮的功能记录
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;
}
在该方法里,主要就是根据用户名username
、系统标识siteid
、功能类型funcType
为按钮的,查询出所有的符合条件的功能列表。并且将功能列表中的func_url
添加到 shiro中的 setStringPermissions
集合里。
对于上边这个方法什么时候触发,我觉得有必要说一下,它的触发时机不是用户登录后触发的!!!而是当点击jsp
页面的时候,只要该页面有shiro
的上边两处标签配置,都会先走这个方法的。也就是说每点击一次带有配置的页面,就会触发上边的接口一次。
比如我给当前用户下的测试角色2
配置了当前的用户授权
按钮权限,那在点击用户管理页面,就会先触发上边的方法,查询出属于当前用户、当前系统属于按钮的功能,并且把里边的func_url
字符串值集合赋给shiro
,回到页面后,在<shiro:hasPermission name="user_authorize">
就会从那个集合里查是否有相应的字符串,有的话就会显示该按钮,没有则不显示。
4.异常注意点
对于按钮的配置,比较简单,但也容易出错,我碰到过一个错误,写在了另一篇文章里,地址是shiro标签页点击报错: No SecurityManager accessible to the calling code…