通常我们后台有很多不同的角色登录,每个角色不同的权限,这个在 SpringBoot整合Shiro实现权限控制,根据不同的角色登录显示不同的菜单。
比如我目前只有两个角色,系统管理员和普通用户。
关于菜单绑定角色,其实也可以菜单绑定权限的。这里为了方便,我们使用使用角色来区分。
SpringBoot不同角色显示不同的菜单
一、数据库设计和数据
1、menu 菜单表
SpringBoot不同角色显示不同的菜单
2、role 表
SpringBoot不同角色显示不同的菜单
3、role_menu 表
SpringBoot不同角色显示不同的菜单
二、核心代码
1、实体
package com.liuyanzhao.blog.api.model;
import lombok.Data;
import java.util.List;
/**
* 菜单
*
* @author liuyanzhao
*/
@Data
public class Menu {
/**
* 菜单ID
*/
private Integer id;
/**
* 父级菜单ID
*/
private Integer pid;
/**
* 菜单名称
*/
private String name;
/**
* 菜单类型:top_menu, main_menu, admin_menu
*/
private String type;
/**
* 菜单URL
*/
private String url;
/**
* 菜单图标
*/
private String icon;
/**
* 菜单分数,越大排序越前
*/
private Integer score;
/**
* 子菜单Menu列表
*/
private List<Menu > childMenu;
}
2、Controller 层
@GetMapping("/admin/menu/listAdminMenu")
@ResponseBody
public ResultVO listAdminMenu() {
List<Menu> result;
//1、判断当前用户的角色
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole("ROLE_ADMIN")) {
//管理员
result = menuService.listAdminMenuByRole(1);
} else {
//普通用户
result = menuService.listAdminMenuByRole(2);
}
if(result == null || result.size() == 0) {
return new ResultVO().error("菜单为空");
}
return new ResultVO().ok(result);
}
3、Service 层
@Override
@Cacheable(value = "menu", key = "'listAdminMenuByRole'+#p0")
public List<Menu> listAdminMenuByRole(Integer roleId) {
List<Menu> menuList;
List<Menu> newMenuList = new ArrayList<>();
try {
//1、根据角色获得所有的菜单(包括一级和二级)
menuList = menuMapper.listMenuByRoleId(roleId);
for (int i = 0; i < menuList.size(); i++) {
Menu menu = menuList.get(i);
List<Menu> childMenuList = new ArrayList<>();
//2、拼装二级菜单
if (menu.getPid() == 0) {
for (int j = 0; j < menuList.size(); j++) {
if (Objects.equals(menu.getId(), menuList.get(j).getPid())) {
childMenuList.add(menuList.get(j));
}
}
menu.setChildMenu(childMenuList);
newMenuList.add(menu);
}
}
} catch (Exception e) {
log.error("【后台菜单获取失败】,cause:{}", e);
}
return newMenuList;
}
4、Dao 层
MenuMapper.java
List<Menu> listMenuByRoleId(Integer roleId);
MenuMapper.xml
<!--从 role_menu 关联表查询-->
<select id="listMenuByRoleId" parameterType="java.lang.Integer"
resultMap="BaseResultMap">
select menu.* from role_menu, menu
where role_menu.role_id = #{value} and role_menu.menu_id = menu.id
</select>