在之前我们已经完成了SSM的整合操作了,这次将利用该项目完成Shiro标签控制菜单项的显示与否,即实现不同的用户有不同的角色,对应不同的权限。
1、 准备三张主表(member、role、action),两张关联表(member_role、role_action),直接自定义好数据,不改动。真实开发是需要进行动态配置的,这里只做简单演示。
2、 创建相关的bean类和mapper文件,新建一个IMemberDAO接口,包含三个方法,IMemberService接口,包含两个方法以及MemberServiceImpl类。
3、 修改MyRealm,进行用户登录认证和用户角色权限设置。
4、 修改UserLoginController,进行用户登录。
5、 修改登录页和新建后台主页,登录成功的用户进行后台主页是会根据角色和权限的不同显示不同的功能。利用shiro标签进行授权检测。
<shiro:hasRole name="member" > <li class="layui-nav-item layui-nav-itemed"> <a class="" href="javascript:;">管理员</a> <dl class="layui-nav-child"> <shiro:hasPermission name="member:add"> <dd><a href="javascript:;">增加管理员</a></dd> </shiro:hasPermission> <shiro:hasPermission name="member:list"> <dd><a href="javascript:;">管理员列表</a></dd> </shiro:hasPermission> </dl> </li> </shiro:hasRole> <shiro:hasRole name="dept"> <li class="layui-nav-item"> <a href="javascript:;">部门管理</a> <dl class="layui-nav-child"> <shiro:hasPermission name="dept:add"> <dd><a href="javascript:;">增加部门</a></dd> </shiro:hasPermission> <shiro:hasPermission name="dept:list"> <dd><a href="javascript:;">部门列表</a></dd> </shiro:hasPermission> <shiro:hasPermission name="dept:edit"> <dd><a href="javascript:;">编辑部门</a></dd> </shiro:hasPermission> </dl> </li> </shiro:hasRole> <shiro:hasRole name="emp"> <li class="layui-nav-item"> <a href="javascript:;">员工管理</a> <dl class="layui-nav-child"> <shiro:hasPermission name="emp:add"> <dd><a href="javascript:;">员工入职</a></dd> </shiro:hasPermission> <shiro:hasPermission name="emp:list"> <dd><a href="javascript:;">员工列表</a></dd> </shiro:hasPermission> <shiro:hasPermission name="emp:edit"> <dd><a href="javascript:;">员工编辑</a></dd> </shiro:hasPermission> <shiro:hasPermission name="emp:remove"> <dd><a href="javascript:;">员工离职</a></dd> </shiro:hasPermission> </dl> </li> </shiro:hasRole>
6、进行用户登录
从以上图片可以看到,我们通过shiro标签实现了权限的动态检测控制。
这次的代码,我们并没有进行授权信息的缓存控制,所以shiro标签的每次授权检测都会去操作数据库。为避免这种情况 ,我们可以在第一次进行授权检测时,把数据保存到session中,下次直接从session中即可。或者可以利用shiro提供的缓存配置进行操作。
注意点:
shiro标签操作需要在页面引入标签库
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags"%>
shiro包含以下几种标签
取得用户名:<shiro:principal/> 是否具备指定角色:<shiro:hasRole name=""></shiro:hasRole> 是否具备有任意一个角色:<shiro:hasAnyRoles name="A,B"></shiro:hasAnyRoles> 是否具备指定权限:<shiro:hasPermission name=""></shiro:hasPermission> 不具备指定角色:<shiro:lacksRole name=""></shiro:lacksRole> 不具备指定权限:<shiro:lacksPermission name=""></shiro:lacksPermission> 已认证用户:<shiro:authenticated></shiro:authenticated> 未认证用户:<shiro:notAuthenticated></shiro:notAuthenticated> 当前用户是否为游客:<shiro:guest></shiro:guest> 取得rememberme中的信息:<shiro:user/>
END