更新路由守卫
Change-Id: Iddd1d006202a03e8a97e3a90d64d9a43c5d2cb78
diff --git a/Merge/front/src/router/Guards.jsx b/Merge/front/src/router/Guards.jsx
index 3fa7408..fe45e30 100644
--- a/Merge/front/src/router/Guards.jsx
+++ b/Merge/front/src/router/Guards.jsx
@@ -1,24 +1,53 @@
// src/router/Guards.jsx
import React from 'react'
-import { Navigate, Outlet, useLocation } from 'react-router-dom'
-import { getAuthToken, getUserInfo } from '../utils/auth'
+import { Navigate, Outlet, useLocation, useParams } from 'react-router-dom'
+import { getUserInfo } from '../utils/auth'
-/** 登录检查:有 token 才放行,否则跳到 /login */
-export function RequireAuth({ children }) {
- const token = getAuthToken()
- const loc = useLocation()
- if (!token) {
- return <Navigate to="/login" state={{ from: loc }} replace />
+/** 需登录 */
+export function RequireAuth() {
+ const user = getUserInfo()
+ const location = useLocation()
+ if (!user) {
+ return <Navigate to="/login" state={{ from: location }} replace />
}
- return children ?? <Outlet />
+ return <Outlet />
}
-/** 角色检查:只有 allowedRoles 内的角色才能访问 */
-export function RequireRole({ allowedRoles, children }) {
+/** 需特定角色 */
+export function RequireRole({ allowedRoles }) {
const user = getUserInfo()
- // user 里应该有 .role
if (!user || !allowedRoles.includes(user.role)) {
return <Navigate to="/login" replace />
}
- return children ?? <Outlet />
+ 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 />
}