Pre Merge pull request !671 from 刘键(LiuJian)/无权限时返回具体的菜单名称

This commit is contained in:
刘键(LiuJian) 2025-04-16 06:35:34 +00:00 committed by Gitee
commit 7791cea049
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
10 changed files with 135 additions and 19 deletions

View File

@ -86,4 +86,12 @@ public interface CacheNames {
*/
String ONLINE_TOKEN = "online_tokens";
/**
* 菜单
*/
String SYS_MENU = "sys_menu#30d";
/**
* 菜单
*/
String SYS_ROLE = "sys_role#30d";
}

View File

@ -0,0 +1,15 @@
package org.dromara.common.core.service;
/**
* 通用菜单接口
*/
public interface MenuService {
/**
* 根据菜单ID查询菜单名称
*
* @param menuId 用户ID
* @return 菜单名称
*/
String selectMenuByPerms(String perms);
}

View File

@ -6,5 +6,11 @@ package org.dromara.common.core.service;
* @author AprilWind
*/
public interface RoleService {
/**
* 根据roleKey查询角色名称
*
* @param roleKey roleKey
* @return 角色名称
*/
String selectRoleByRoleKey(String roleKey);
}

View File

@ -7,6 +7,9 @@ import cn.hutool.http.HttpStatus;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.service.MenuService;
import org.dromara.common.core.service.RoleService;
import org.dromara.common.core.utils.SpringUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@ -25,8 +28,9 @@ public class SaTokenExceptionHandler {
@ExceptionHandler(NotPermissionException.class)
public R<Void> handleNotPermissionException(NotPermissionException e, HttpServletRequest request) {
String requestURI = request.getRequestURI();
log.error("请求地址'{}',权限码校验失败'{}'", requestURI, e.getMessage());
return R.fail(HttpStatus.HTTP_FORBIDDEN, "没有访问权限,请联系管理员授权");
log.error("请求地址'{}',权限码校验失败'{}-{}-{}'", requestURI, e.getLoginType(), e.getPermission(), e.getMessage());
final String n = SpringUtils.getBean(MenuService.class).selectMenuByPerms(e.getPermission());
return R.fail(HttpStatus.HTTP_FORBIDDEN, "没有【" + n + "】访问权限,请联系管理员授权");
}
/**
@ -35,8 +39,9 @@ public class SaTokenExceptionHandler {
@ExceptionHandler(NotRoleException.class)
public R<Void> handleNotRoleException(NotRoleException e, HttpServletRequest request) {
String requestURI = request.getRequestURI();
log.error("请求地址'{}',角色权限校验失败'{}'", requestURI, e.getMessage());
return R.fail(HttpStatus.HTTP_FORBIDDEN, "没有访问权限,请联系管理员授权");
log.error("请求地址'{}',角色权限校验失败'{}-{}-{}'", requestURI, e.getLoginType(), e.getRole(), e.getMessage());
final String n = SpringUtils.getBean(RoleService.class).selectRoleByRoleKey(e.getRole());
return R.fail(HttpStatus.HTTP_FORBIDDEN, "没有【" + n + "】访问权限,请联系管理员授权");
}
/**

View File

@ -73,4 +73,5 @@ public interface SysMenuMapper extends BaseMapperPlus<SysMenu, SysMenuVo> {
*/
List<Long> selectMenuListByRoleId(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly);
SysMenuVo selectVoByPerms(String perms);
}

View File

@ -72,4 +72,6 @@ public interface SysRoleMapper extends BaseMapperPlus<SysRole, SysRoleVo> {
*/
List<SysRoleVo> selectRolesByUserId(Long userId);
SysRoleVo selectByRoleKey(String roleKey);
}

View File

@ -9,6 +9,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.constant.CacheNames;
import org.dromara.common.core.service.MenuService;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
@ -27,6 +29,7 @@ import org.dromara.system.mapper.SysRoleMapper;
import org.dromara.system.mapper.SysRoleMenuMapper;
import org.dromara.system.mapper.SysTenantPackageMapper;
import org.dromara.system.service.ISysMenuService;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import java.util.*;
@ -38,7 +41,7 @@ import java.util.*;
*/
@RequiredArgsConstructor
@Service
public class SysMenuServiceImpl implements ISysMenuService {
public class SysMenuServiceImpl implements ISysMenuService, MenuService {
private final SysMenuMapper baseMapper;
private final SysRoleMapper roleMapper;
@ -169,11 +172,15 @@ public class SysMenuServiceImpl implements ISysMenuService {
if (tenantPackage.getMenuCheckStrictly()) {
parentIds = baseMapper.selectObjs(new LambdaQueryWrapper<SysMenu>()
.select(SysMenu::getParentId)
.in(SysMenu::getMenuId, menuIds), x -> {return Convert.toLong(x);});
.in(SysMenu::getMenuId, menuIds), x -> {
return Convert.toLong(x);
});
}
return baseMapper.selectObjs(new LambdaQueryWrapper<SysMenu>()
.in(SysMenu::getMenuId, menuIds)
.notIn(CollUtil.isNotEmpty(parentIds), SysMenu::getMenuId, parentIds), x -> {return Convert.toLong(x);});
.notIn(CollUtil.isNotEmpty(parentIds), SysMenu::getMenuId, parentIds), x -> {
return Convert.toLong(x);
});
}
/**
@ -369,4 +376,16 @@ public class SysMenuServiceImpl implements ISysMenuService {
}
}
/**
* 根据菜单ID查询菜单信息
*
* @param menuId 用户ID
* @return 菜单信息
*/
@Cacheable(cacheNames = CacheNames.SYS_MENU, key = "#perms")
@Override
public String selectMenuByPerms(String perms) {
final SysMenuVo menuVo = baseMapper.selectVoByPerms(perms);
return menuVo.getMenuName();
}
}

View File

@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.CacheNames;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.constant.CacheNames;
import org.dromara.common.core.constant.TenantConstants;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.exception.ServiceException;
@ -36,6 +37,7 @@ import org.dromara.system.mapper.SysRoleMenuMapper;
import org.dromara.system.mapper.SysUserRoleMapper;
import org.dromara.system.service.ISysRoleService;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -549,4 +551,17 @@ public class SysRoleServiceImpl implements ISysRoleService, RoleService {
});
}
/**
* 根据roleKey查询角色名称
*
* @param roleKey roleKey
* @return 角色名称
*/
@Cacheable(cacheNames = CacheNames.SYS_ROLE, key = "#roleKey")
@Override
public String selectRoleByRoleKey(String roleKey) {
final SysRoleVo roleVo = baseMapper.selectByRoleKey(roleKey);
return roleVo.getRoleName();
}
}

View File

@ -1,19 +1,30 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.system.mapper.SysMenuMapper">
<resultMap type="org.dromara.system.domain.SysMenu" id="SysMenuResult">
</resultMap>
<resultMap type="org.dromara.system.domain.SysMenu" id="SysMenuResult"/>
<select id="selectMenuListByUserId" resultMap="SysMenuResult">
select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.query_param, m.visible, m.status,
m.perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
select distinct m.menu_id,
m.parent_id,
m.menu_name,
m.path,
m.component,
m.query_param,
m.visible,
m.status,
m.perms,
m.is_frame,
m.is_cache,
m.menu_type,
m.icon,
m.order_num,
m.create_time
from sys_menu m
left join sys_role_menu rm on m.menu_id = rm.menu_id
left join sys_role r on rm.role_id = r.role_id
${ew.getCustomSqlSegment}
left join sys_role_menu rm on m.menu_id = rm.menu_id
left join sys_role r on rm.role_id = r.role_id
${ew.getCustomSqlSegment}
</select>
<select id="selectMenuTreeByUserId" parameterType="Long" resultMap="SysMenuResult">
@ -64,7 +75,28 @@
select distinct m.perms
from sys_menu m
left join sys_role_menu rm on m.menu_id = rm.menu_id
where m.status = '0' and rm.role_id = #{roleId}
where m.status = '0'
and rm.role_id = #{roleId}
</select>
<select id="selectVoByPerms" resultType="org.dromara.system.domain.vo.SysMenuVo">
select distinct m.menu_id,
m.parent_id,
m.menu_name,
m.path,
m.component,
m.query_param,
m.visible,
m.status,
m.perms,
m.is_frame,
m.is_cache,
m.menu_type,
m.icon,
m.order_num,
m.create_time
from sys_menu m
where m.perms = #{perms}
</select>
</mapper>

View File

@ -56,4 +56,17 @@
WHERE r.del_flag = '0' and r.role_id = #{roleId}
</select>
<select id="selectByRoleKey" resultType="org.dromara.system.domain.vo.SysRoleVo">
select r.role_id,
r.role_name,
r.role_key,
r.role_sort,
r.data_scope,
r.status,
r.remark,
r.create_time
from sys_role r
WHERE r.role_key = #{roleKey}
</select>
</mapper>