修复:原来的统一去了404, 现在加了403, 和部分bug
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 6m54s
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 6m54s
This commit is contained in:
@@ -107,10 +107,12 @@ export const hasRoutePermission = (
|
||||
*/
|
||||
function checkMenuAccess(path: string, menus: any[]): boolean {
|
||||
for (const menu of menus) {
|
||||
// 检查当前菜单的 URL 是否匹配
|
||||
if (menu.url && (path === menu.url || path.startsWith(menu.url + '/'))) {
|
||||
// 检查当前菜单的 URL 是否匹配(支持动态参数)
|
||||
if (menu.url && matchMenuPath(path, menu.url)) {
|
||||
console.log(`[菜单权限检查] 路径 ${path} 匹配菜单 ${menu.url}`)
|
||||
return true
|
||||
}
|
||||
|
||||
// 递归检查子菜单
|
||||
if (menu.children && menu.children.length > 0) {
|
||||
if (checkMenuAccess(path, menu.children)) {
|
||||
@@ -118,9 +120,53 @@ function checkMenuAccess(path: string, menus: any[]): boolean {
|
||||
}
|
||||
}
|
||||
}
|
||||
console.log(`[菜单权限检查] 路径 ${path} 未找到匹配的菜单`)
|
||||
return false
|
||||
}
|
||||
|
||||
/**
|
||||
* 匹配菜单路径,支持动态参数
|
||||
* @param actualPath 实际访问路径,如 /account-management/enterprise-customer/customer-accounts/3000
|
||||
* @param menuPath 菜单定义路径,如 /account-management/enterprise-customer/customer-accounts/:id
|
||||
*/
|
||||
function matchMenuPath(actualPath: string, menuPath: string): boolean {
|
||||
// 移除查询参数
|
||||
const cleanActualPath = actualPath.split('?')[0]
|
||||
const cleanMenuPath = menuPath.split('?')[0]
|
||||
|
||||
// 如果完全匹配,直接返回
|
||||
if (cleanActualPath === cleanMenuPath) {
|
||||
return true
|
||||
}
|
||||
|
||||
// 将路径分割成段
|
||||
const actualSegments = cleanActualPath.split('/').filter(Boolean)
|
||||
const menuSegments = cleanMenuPath.split('/').filter(Boolean)
|
||||
|
||||
// 段数必须相同
|
||||
if (actualSegments.length !== menuSegments.length) {
|
||||
return false
|
||||
}
|
||||
|
||||
// 逐段比较
|
||||
for (let i = 0; i < menuSegments.length; i++) {
|
||||
const menuSegment = menuSegments[i]
|
||||
const actualSegment = actualSegments[i]
|
||||
|
||||
// 如果是动态参数(以 : 开头),跳过比较
|
||||
if (menuSegment.startsWith(':')) {
|
||||
continue
|
||||
}
|
||||
|
||||
// 如果不是动态参数,必须完全匹配
|
||||
if (menuSegment !== actualSegment) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查 Token 是否有效
|
||||
* 简单检查,真实项目中应该验证 JWT 或者调用后端接口
|
||||
|
||||
Reference in New Issue
Block a user