Files
leaudit-platform-frontend/app/components/auth/ClientAuthGuard.tsx
T
LiangShiyong 3850d05bdd feat: 1. 将大部分的请求从fetch改成axios方便管理。
2. 给文档类型添加入口模块和相关数据的渲染。并且给文档类型进行功能上的角色权限区分
3. 新增角色权限管理页面
2025-11-20 20:34:31 +08:00

58 lines
1.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 客户端认证守卫组件
*
* 在客户端检查 localStorage 中的 token
* 如果未认证且访问的是需要认证的路径,则跳转到登录页
*/
import { useEffect } from 'react';
import { useNavigate, useLocation } from '@remix-run/react';
import { isAuthenticated } from '~/utils/auth-storage';
interface ClientAuthGuardProps {
isPublicPath: boolean;
}
export function ClientAuthGuard({ isPublicPath }: ClientAuthGuardProps) {
const navigate = useNavigate();
const location = useLocation();
useEffect(() => {
console.log('🔍 [Auth Guard] useEffect 触发', {
isPublicPath,
pathname: location.pathname
});
// 如果是公共路径,不需要检查认证
if (isPublicPath) {
console.log('✅ [Auth Guard] 公共路径,跳过认证检查');
return;
}
// 检查客户端是否已认证(localStorage 中有 token
const token = localStorage.getItem('access_token');
const authenticated = isAuthenticated();
// console.log('🔍 [Auth Guard] 认证检查', {
// token: token ? `${token.substring(0, 20)}...` : null,
// authenticated,
// pathname: location.pathname
// });
if (!authenticated) {
console.log('🔒 [Auth Guard] 未认证,重定向到登录页');
// 保存当前路径,登录后可以跳转回来
const redirectTo = location.pathname !== '/login' ? location.pathname : '/';
// 跳转到登录页,并传递重定向目标
navigate(`/login?redirect=${encodeURIComponent(redirectTo)}`, { replace: true });
} else {
// console.log('✅ [Auth Guard] 已认证,允许访问');
}
}, [isPublicPath, navigate, location.pathname]);
// 这个组件不渲染任何内容
return null;
}