You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Core UI React中保护仪表盘路由

实现Core UI React Admin Dashboard路由保护的步骤

我来帮你搞定Core UI React仪表盘的路由保护,其实思路很清晰——我们需要一个路由守卫组件,用来拦截未登录用户访问受保护的页面,下面分步骤来实现:

1. 创建ProtectedRoute路由守卫组件

首先在项目里新建src/components/ProtectedRoute.js文件,这个组件会负责检查用户登录状态,未登录就跳转到登录页:

import React, { useContext } from 'react';
import { Route, Redirect } from 'react-router-dom';
// 后面会用到Context管理登录状态,先提前导入
import { AuthContext } from '../contexts/AuthContext';

const ProtectedRoute = ({ component: Component, ...rest }) => {
  // 两种判断登录状态的方式,选一种就行
  // 方式一:简单场景用localStorage直接判断
  // const isAuthenticated = localStorage.getItem('authToken') !== null;

  // 方式二:复杂应用用React Context管理状态(推荐)
  const { isAuthenticated } = useContext(AuthContext);

  return (
    <Route
      {...rest}
      render={props =>
        isAuthenticated ? (
          <Component {...props} />
        ) : (
          <Redirect to="/login" /> // 未登录时强制跳转到登录页
        )
      }
    />
  );
};

export default ProtectedRoute;

2. 配置登录状态管理(可选但推荐)

如果你的应用需要在多个组件里同步登录状态,建议用React Context来集中管理,这样比直接操作localStorage更灵活:

2.1 创建AuthContext

新建src/contexts/AuthContext.js:

import React, { createContext, useState, useEffect } from 'react';

export const AuthContext = createContext();

export const AuthProvider = ({ children }) => {
  const [isAuthenticated, setIsAuthenticated] = useState(false);

  // 页面加载时自动检查本地存储的登录token
  useEffect(() => {
    const token = localStorage.getItem('authToken');
    if (token) setIsAuthenticated(true);
  }, []);

  // 登录方法:保存token并更新状态
  const login = (token) => {
    localStorage.setItem('authToken', token);
    setIsAuthenticated(true);
  };

  // 登出方法:移除token并重置状态
  const logout = () => {
    localStorage.removeItem('authToken');
    setIsAuthenticated(false);
  };

  return (
    <AuthContext.Provider value={{ isAuthenticated, login, logout }}>
      {children}
    </AuthContext.Provider>
  );
};

2.2 在App.js中包裹路由

修改src/App.js,让整个应用都能访问到AuthContext的状态:

import React from 'react';
import { Router } from 'react-router-dom';
import { createBrowserHistory } from 'history';
import { renderRoutes } from 'react-router-config';
import { AuthProvider } from './contexts/AuthContext';
import routes from './routes';

const history = createBrowserHistory();

const App = () => (
  <AuthProvider>
    <Router history={history}>
      {renderRoutes(routes)}
    </Router>
  </AuthProvider>
);

export default App;

3. 修改routes.js,保护目标路由

回到你的routes.js,先导入ProtectedRoute和登录组件,然后把需要保护的路由(比如仪表盘、主题设置、基础组件页面等)用ProtectedRoute包裹:

3.1 导入必要组件

在routes.js顶部添加:

import ProtectedRoute from './components/ProtectedRoute';
import Login from './views/Login'; // 导入你的登录组件,没有的话先创建一个简单的登录页

3.2 更新路由配置

把需要保护的路由替换成如下格式,以Dashboard为例:

// 原来的非保护路由
// { path: '/dashboard', name: 'Dashboard', component: Dashboard },

// 修改后的保护路由
{ 
  path: '/dashboard', 
  name: 'Dashboard', 
  component: (props) => <ProtectedRoute {...props} component={Dashboard} /> 
},

你可以批量修改所有需要保护的路由(比如/theme、/base、/buttons等),最后记得添加登录页的路由:

// 在routes数组末尾添加登录路由
{ path: '/login', name: 'Login', component: Login },

4. 实现登录和登出逻辑

在你的登录组件里,调用登录接口成功后,执行以下代码完成登录跳转:

import React, { useContext } from 'react';
import { AuthContext } from '../contexts/AuthContext';

const Login = (props) => {
  const { login } = useContext(AuthContext);

  const handleLogin = async () => {
    // 这里替换成你的登录接口调用逻辑
    const response = await fetch('/api/login', { /* 请求参数 */ });
    const { token } = await response.json();
    
    // 保存token并更新登录状态
    login(token);
    // 跳转到仪表盘
    props.history.push('/dashboard');
  };

  return (
    // 这里写你的登录表单UI,用Core UI的表单组件即可
    <div>
      <input type="text" placeholder="用户名" />
      <input type="password" placeholder="密码" />
      <button onClick={handleLogin}>登录</button>
    </div>
  );
};

export default Login;

在导航栏的登出按钮里,添加登出逻辑:

import React, { useContext } from 'react';
import { AuthContext } from '../contexts/AuthContext';

const Navbar = (props) => {
  const { logout } = useContext(AuthContext);

  const handleLogout = () => {
    logout();
    props.history.push('/login');
  };

  return (
    <nav>
      {/* 其他导航项 */}
      <button onClick={handleLogout}>登出</button>
    </nav>
  );
};

额外提示

  • 如果你的后端用JWT认证,记得在所有请求的请求头里带上Authorization: Bearer ${token}
  • 可以给ProtectedRoute扩展权限判断逻辑,比如只允许管理员访问某些路由
  • 登录页可以用Core UI的表单组件快速搭建,保持和仪表盘一致的风格

内容的提问来源于stack exchange,提问作者Srikanth Gowda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:09:06