PA6 补齐权限与审计回归

这个提交包含在:
2026-05-12 08:29:18 +08:00
父节点 aec660a8fe
当前提交 a0dc6fc408
共修改 13 个文件,包含 645 行新增和 42 行删除
+15 -1
查看文件
@@ -1,7 +1,7 @@
import type { PropsWithChildren } from "react";
import { Navigate, useLocation } from "react-router-dom";
import { useAuth } from "../auth/AuthContext";
import { hasAnyPermission } from "../auth/permissions";
import { hasAnyPermission, hasBusinessApproverRole } from "../auth/permissions";
import { resolveDefaultWorkspacePath } from "../lib/runtimeContext";
import { isOfflineSnapshotAllowedPath } from "../pwa";
@@ -78,3 +78,17 @@ export function RequirePermission({
return <>{children}</>;
}
export function RequireBusinessApprover({ children }: PropsWithChildren) {
const { me, permissions, ready } = useAuth();
if (!ready) {
return <FullPageLoading />;
}
if (!hasBusinessApproverRole(me?.roleCodes, permissions)) {
return <Navigate to="/403" replace />;
}
return <>{children}</>;
}
+11 -7
查看文件
@@ -68,7 +68,7 @@ import {
WorkflowTaskDetailPage,
WorkflowTasksPage,
} from "./lazy";
import { GuestOnly, RequireAuth, RequirePermission } from "./guards";
import { GuestOnly, RequireAuth, RequireBusinessApprover, RequirePermission } from "./guards";
function withRouteFallback(node: ReactNode) {
return <Suspense fallback={<RoutePageFallback />}>{node}</Suspense>;
@@ -277,18 +277,18 @@ export function AppRouter() {
<Route
path="workflow/tasks"
element={
<RequirePermission anyOf={["expense.approve", "leave.approve", "procurement.approve", "travel.approve"]}>
<RequireBusinessApprover>
{withRouteFallback(<WorkflowTasksPage />)}
</RequirePermission>
</RequireBusinessApprover>
}
/>
<Route
path="workflow/tasks/:taskId"
element={
<RequirePermission anyOf={["expense.approve", "leave.approve", "procurement.approve", "travel.approve"]}>
<RequireBusinessApprover>
{withRouteFallback(<WorkflowTaskDetailPage />)}
</RequirePermission>
</RequireBusinessApprover>
}
/>
@@ -358,7 +358,11 @@ export function AppRouter() {
<Route
path="mobile/approvals"
element={withRouteFallback(<MobileApprovalsPage />)}
element={
<RequireBusinessApprover>
{withRouteFallback(<MobileApprovalsPage />)}
</RequireBusinessApprover>
}
/>
<Route path="notifications" element={withRouteFallback(<NotificationsPage />)} />
@@ -485,7 +489,7 @@ export function AppRouter() {
<Route
path="system/settings"
element={
<RequirePermission anyOf={["system.settings", "system.users", "masterdata.view", "masterdata.manage", "notification.channel.manage", "integration.manage"]}>
<RequirePermission anyOf={["system.settings", "system.users", "masterdata.manage", "notification.channel.manage", "integration.manage"]}>
{withRouteFallback(<SystemSettingsPage />)}
</RequirePermission>
}