blob: fe45e301b2185c660f1b5dbd1d3050647d751c1b [file] [log] [blame]
wu2f28f672025-06-19 14:29:30 +08001// src/router/Guards.jsx
2import React from 'react'
wu70fc8c52025-06-19 15:55:03 +08003import { Navigate, Outlet, useLocation, useParams } from 'react-router-dom'
4import { getUserInfo } from '../utils/auth'
wu2f28f672025-06-19 14:29:30 +08005
wu70fc8c52025-06-19 15:55:03 +08006/** 需登录 */
7export function RequireAuth() {
8 const user = getUserInfo()
9 const location = useLocation()
10 if (!user) {
11 return <Navigate to="/login" state={{ from: location }} replace />
wu2f28f672025-06-19 14:29:30 +080012 }
wu70fc8c52025-06-19 15:55:03 +080013 return <Outlet />
wu2f28f672025-06-19 14:29:30 +080014}
15
wu70fc8c52025-06-19 15:55:03 +080016/** 需特定角色 */
17export function RequireRole({ allowedRoles }) {
wu2f28f672025-06-19 14:29:30 +080018 const user = getUserInfo()
wu2f28f672025-06-19 14:29:30 +080019 if (!user || !allowedRoles.includes(user.role)) {
20 return <Navigate to="/login" replace />
21 }
wu70fc8c52025-06-19 15:55:03 +080022 return <Outlet />
23}
24
25/** 只能访问自己的用户详情 */
26export function RequireOwnProfile() {
27 const user = getUserInfo()
28 const { userId } = useParams()
29 if (!user || user.id.toString() !== userId) {
30 return <Navigate to="/home" replace />
31 }
32 return <Outlet />
33}
34
35/** 只能访问自己的 Admin 页面 */
36export function RequireAdminOwn() {
37 const user = getUserInfo()
38 const { userId } = useParams()
39 if (!user || user.role !== 'admin' || user.id.toString() !== userId) {
40 return <Navigate to="/login" replace />
41 }
42 return <Outlet />
43}
44
45/** 只能访问自己的 SuperAdmin 区 */
46export function RequireSuperAdminOwn() {
47 const user = getUserInfo()
48 const { userId } = useParams()
49 if (!user || user.role !== 'superadmin' || user.id.toString() !== userId) {
50 return <Navigate to="/login" replace />
51 }
52 return <Outlet />
wu2f28f672025-06-19 14:29:30 +080053}