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…
下一篇文章shiro框架—关于用户多站点登录的标识字段的位置 |