版权声明:本文为博主原创文章,未经博主允许不得转载! https://blog.csdn.net/MaNongXf/article/details/83826194
在之前的博客中已经实现了Shiro的登陆认证功能——《SSM+Shiro实现登陆认证》
今天利用Shiro实现一个页面细粒化权限的控制功能。
为什么说是细粒化呢?因为它可以精准到页面上的每一个按钮,把控每一个按钮的访问权限,可以说是非常强大了,而且简单~
想实现页面的授权功能首先要在页面导入一个shiro的标签:
<%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro"%>
然后用以下标签包裹
<shiro:hasPermission name=""></shiro:hasPermission>
实现权限的控制!
我现在要对后台的一个菜单中的 “发布商品” 进行权限控制
在页面的代码中加上Shiro的标签(这两个标签对应着页面上的云市场与发布商品)
<li class="layui-nav-item"><a href="">云市场</a></li>
<shiro:hasPermission name="push">
<li class="layui-nav-item"><a href="">发布商品</a></li>
</shiro:hasPermission>
在发布商品的标签上包裹了一层shiro的标签,那么登陆的用户必须要有shiro标签中 “name” 对应的权限!
可以看到,加上这个标签以后再次访问页面,“发布商品” 菜单不见了
那么这个时候如果我们想看到它,就只需要在realm的授权方法中给他对应的权限即可!
/**
* 授权的时候回调
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addStringPermission("push");//这里添加进去的“push” 对应着前端页面的name值
//"*"代表所有权限
return info;
}
这样以后页面的 发布商品 又回来了!
其实Shiro权限控制原理大致就是如此,当然啦,这里只是一个简单的小例子,如果要做到根据角色分配权限,只是在数据库里多建几张表关联起来而已,根据对应的角色查询它所拥有的权限,然后循环遍历add到info里即可!
这里举个简单例子,实现通过遍历数据库来获得权限(这里只是简单的例子,就不用中间表啦)
为了更好的演示,在前端页面给 “云市场” 也加上Shiro的标签,name设置为"shop"
<shiro:hasPermission name="shop">
<li class="layui-nav-item"><a href="">云市场</a></li>
</shiro:hasPermission>
<shiro:hasPermission name="push">
<li class="layui-nav-item"><a href="">发布商品</a></li>
</shiro:hasPermission>
首先是用户表
权限表:
pid:权限对应的一个编号,在用户表上给对应的用户添加pid来获得对应的权限~
这里给用户“萌”的pid(权限编码)为2,2在权限表对应的是push与shop权限,也就是说用户 “萌”有访问“云市场”与“发布商品” 的权限!!!
授权的回调方法如下:
/**
* 授权的时候回调
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
User user = (User) principalCollection.getPrimaryPrincipal();//获取到登陆的对象
if(user.getPid()==1){//如果权限编码为1就是超级管理员
info.addStringPermission("*");//赋予管理员所有权限
}else {
List<Permission> list = loginService.QueryAllPermission(user.getPid());//如果是普通用户就根据权限编号pid去数据库查询
for (Permission permission:
list) {
info.addStringPermission(permission.getPermission());//遍历添加权限
}
}
return info;
}
然后用用户“萌” 的账号密码登陆~
可以看到她已经拥有了访问这两个菜单的权限~