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

如何用React v18和React Router Dom v6.11保护路由并创建PrivateRoute组件

实现Keycloak保护的PrivateRoute组件

1. 创建PrivateRoute组件

这个组件会检查Keycloak的初始化状态和用户登录状态,未登录时自动跳转到Keycloak登录页面,登录完成后返回原路由。

import { useKeycloak } from "@react-keycloak/web";
import { Outlet } from "react-router-dom";

const PrivateRoute = () => {
  const { initialized, authenticated, login } = useKeycloak();

  // 等待Keycloak初始化完成
  if (!initialized) {
    return <h3>Loading ... !!!</h3>;
  }

  // 未登录则触发Keycloak登录,登录后返回当前页面
  if (!authenticated) {
    login({ redirectUri: window.location.href });
    return <h3>Redirecting to login...</h3>;
  }

  // 已登录则渲染受保护的子组件
  return <Outlet />;
};

export default PrivateRoute;

2. 修改App.js的路由配置

用PrivateRoute包裹需要保护的路由,这里采用React Router v6的嵌套路由写法:

import { useKeycloak } from "@react-keycloak/web";
import { BrowserRouter, Routes, Route } from "react-router-dom";
import LandingPage from "./LandingPage";
import TestComponent from "./TestComponent"; // 修正原代码中的拼写错误(TestCompoent → TestComponent)
import PrivateRoute from "./PrivateRoute";

function App() {
  const { initialized } = useKeycloak();

  if (!initialized) {
    return <h3>Loading ... !!!</h3>;
  }

  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<LandingPage />} />
        {/* 用PrivateRoute保护/secure路由 */}
        <Route element={<PrivateRoute />}>
          <Route path="/secure" element={<TestComponent />} />
        </Route>
      </Routes>
    </BrowserRouter>
  );
}

export default App;

可选写法:直接包裹组件的PrivateRoute

如果习惯更直观的包裹式写法,也可以这样定义PrivateRoute:

import { useKeycloak } from "@react-keycloak/web";

const PrivateRoute = ({ children }) => {
  const { initialized, authenticated, login } = useKeycloak();

  if (!initialized) {
    return <h3>Loading ... !!!</h3>;
  }

  if (!authenticated) {
    login({ redirectUri: window.location.href });
    return <h3>Redirecting to login...</h3>;
  }

  return children;
};

export default PrivateRoute;

对应的App.js路由写法:

<Route path="/secure" element={<PrivateRoute><TestComponent /></PrivateRoute>} />

关键说明

  • 依赖useKeycloak提供的authenticated状态判断用户登录情况
  • 调用login方法时传入redirectUri,确保用户登录后回到当前受保护的页面
  • 必须等待initialized状态为true再执行判断逻辑,避免Keycloak未完成初始化时出现异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:15:27