blob: fe45e301b2185c660f1b5dbd1d3050647d751c1b [file] [log] [blame]
// src/router/Guards.jsx
import React from 'react'
import { Navigate, Outlet, useLocation, useParams } from 'react-router-dom'
import { getUserInfo } from '../utils/auth'
/** 需登录 */
export function RequireAuth() {
const user = getUserInfo()
const location = useLocation()
if (!user) {
return <Navigate to="/login" state={{ from: location }} replace />
}
return <Outlet />
}
/** 需特定角色 */
export function RequireRole({ allowedRoles }) {
const user = getUserInfo()
if (!user || !allowedRoles.includes(user.role)) {
return <Navigate to="/login" replace />
}
return <Outlet />
}
/** 只能访问自己的用户详情 */
export function RequireOwnProfile() {
const user = getUserInfo()
const { userId } = useParams()
if (!user || user.id.toString() !== userId) {
return <Navigate to="/home" replace />
}
return <Outlet />
}
/** 只能访问自己的 Admin 页面 */
export function RequireAdminOwn() {
const user = getUserInfo()
const { userId } = useParams()
if (!user || user.role !== 'admin' || user.id.toString() !== userId) {
return <Navigate to="/login" replace />
}
return <Outlet />
}
/** 只能访问自己的 SuperAdmin 区 */
export function RequireSuperAdminOwn() {
const user = getUserInfo()
const { userId } = useParams()
if (!user || user.role !== 'superadmin' || user.id.toString() !== userId) {
return <Navigate to="/login" replace />
}
return <Outlet />
}