您的位置:首页 > 其它

shiro框架---关于用户登录和权限验证功能的实现步骤(七)

2018-02-22 15:05 1181 查看

shiro框架里按钮的权限控制

上一篇文章shiro框架—关于用户登录和权限验证功能的实现步骤(六)

  通过前几篇的文章里,写了关于数据库建表、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…
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐