blob: 290c619a0956e0b8c9d9025d753707d291286e8f [file] [log] [blame]
ybtda5978b2025-05-31 15:58:05 +08001import React from "react";
2import { Navigate, useLocation } from "react-router-dom";
3import { useAuth } from "../features/auth/contexts/AuthContext"; // 更新路径
4import { Spin, Result, Button } from "antd";
ybt02e716d2025-04-15 17:19:32 +08005
ybtda5978b2025-05-31 15:58:05 +08006const PermissionRoute = ({ children, requiredRoles }) => {
7 const { user, isAuthenticated, loading, hasRole } = useAuth();
8 const location = useLocation();
9
10 if (loading) {
11 return (
12 <div className="flex justify-center items-center min-h-screen">
13 <Spin size="large" tip="检查权限中..." />
14 </div>
15 );
ybt02e716d2025-04-15 17:19:32 +080016 }
ybtda5978b2025-05-31 15:58:05 +080017
18 if (!isAuthenticated) {
19 return <Navigate to="/login" state={{ from: location }} replace />;
20 }
21
22 // 角色检查
23 const hasRequiredRoles = requiredRoles
24 ? requiredRoles.some((role) => hasRole(role)) // 满足任一角色即可
25 : true; // 如果没有指定 requiredRoles,则认为通过
26
27 if (hasRequiredRoles) {
28 return children; // 用户有权限,渲染子组件
29 }
30
31 // 用户无权限
32 return (
33 <Result
34 status="403"
35 title="403 - 禁止访问"
36 subTitle="抱歉,您没有权限访问此页面。"
37 extra={
38 <Button type="primary" onClick={() => window.history.back()}>
39 返回上一页
40 </Button>
41 }
42 />
43 );
44 // 或者重定向到 /unauthorized 页面
45 // return <Navigate to="/unauthorized" state={{ from: location }} replace />;
ybt02e716d2025-04-15 17:19:32 +080046};
47
ybtda5978b2025-05-31 15:58:05 +080048export default PermissionRoute;