React Router v6配置路由守卫

ops/2025/2/1 18:53:42/

首先准备好以下页面

登录页:用户可以在此页面登录。
受保护页:只有登录的用户可以访问,否则会重定向到登录页。
公共页面:不需要鉴权,任何人都可以访问。

1. 安装依赖
首先,我们需要安装 react-router-dom:
npm install react-router-dom
2. 设置鉴权逻辑
使用 React Context 来管理用户的登录状态(模拟鉴权)。创建一个简单的 AuthContext 来保存和提供用户的登录信息。

//AuthContext.jsimport React, { createContext, useContext, useState } from 'react';// 创建 AuthContext
const AuthContext = createContext();// 提供 AuthContext 的自定义 Hook
export const useAuth = () => {return useContext(AuthContext);
};// 创建 AuthProvider 来管理用户认证状态
export const AuthProvider = ({ children }) => {const [isAuthenticated, setIsAuthenticated] = useState(false);const login = () => setIsAuthenticated(true);const logout = () => setIsAuthenticated(false);return (<AuthContext.Provider value={{ isAuthenticated, login, logout }}>{children}</AuthContext.Provider>);
};

 3. 配置路由守卫
在 React Router v6 中,路由守卫通过 Navigate 组件进行重定向。我们需要创建一个 PrivateRoute 组件来作为守卫,用于保护受限制的页面。

//PrivateRoute.jsimport React from 'react';
import { Navigate } from 'react-router-dom';
import { useAuth } from './AuthContext';// PrivateRoute 组件用于保护需要认证的路由
const PrivateRoute = ({ element }) => {const { isAuthenticated } = useAuth();if (!isAuthenticated) {// 如果用户未认证,重定向到登录页面return <Navigate to="/login" />;}return element;
};export default PrivateRoute;

 4. 创建页面组件
需要三个页面:登录页、受保护页和公共页面。

//LoginPage.jsimport React, { useState } from 'react';
import { useAuth } from './AuthContext';
import { useNavigate } from 'react-router-dom';const LoginPage = () => {const [username, setUsername] = useState('');const { login } = useAuth();const navigate = useNavigate();const handleLogin = () => {// 这里可以做更复杂的验证if (username) {login(); // 登录navigate('/protected'); // 登录后跳转到受保护页}};return (<div><h2>Login Page</h2><inputtype="text"placeholder="Enter username"value={username}onChange={(e) => setUsername(e.target.value)}/><button onClick={handleLogin}>Login</button></div>);
};export default LoginPage;
//ProtectedPage.jsimport React from 'react';
import { useAuth } from './AuthContext';const ProtectedPage = () => {const { logout } = useAuth();return (<div><h2>Protected Page</h2><p>This page is only accessible after login.</p><button onClick={logout}>Logout</button></div>);
};export default ProtectedPage;
//PublicPage.jsimport React from 'react';const PublicPage = () => {return (<div><h2>Public Page</h2><p>This page is accessible to everyone.</p></div>);
};export default PublicPage;

5. 配置路由
配置 App.js,并使用 BrowserRouter 和 Routes 来定义路由。
 

//App.jsimport React from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import { AuthProvider } from './AuthContext';
import LoginPage from './LoginPage';
import ProtectedPage from './ProtectedPage';
import PublicPage from './PublicPage';
import PrivateRoute from './PrivateRoute';const App = () => {return (<AuthProvider><Router><Routes><Route path="/" element={<PublicPage />} /><Route path="/login" element={<LoginPage />} />{/* 使用 PrivateRoute 保护受保护页 */}<Routepath="/protected"element={<PrivateRoute element={<ProtectedPage />} />}/></Routes></Router></AuthProvider>);
};export default App;

6. 代码解释
AuthContext.js:提供一个简单的上下文 (AuthContext),用于管理用户的认证状态,包括登录 (login) 和登出 (logout) 操作。
PrivateRoute.js:通过 PrivateRoute 组件来保护受保护的页面。如果用户未登录,自动重定向到登录页面。
页面组件:登录页、受保护页和公共页面通过普通的 React 组件实现。登录页允许用户输入用户名并登录,受保护页需要用户登录才能访问,公共页面可以供所有用户访问。
App.js:在 App.js 中使用 React Router 的 Routes 来配置路由,并根据需要使用 PrivateRoute 来保护需要鉴权的页面。

总结
使用 React Router v6 配置路由守卫。
使用 React Context 来管理认证状态,并通过 Navigate 组件来控制页面访问权限。
PrivateRoute 是路由守卫的核心,它根据用户的认证状态来决定是否允许访问某些受保护的页面。
这种方式适用于构建具有基本鉴权逻辑的 React 应用,适合大部分的需求。
 


http://www.ppmy.cn/ops/154823.html

相关文章

01-时间与管理

时间与效率 一丶番茄时钟步骤好处 二丶86400s的财富利用时间的方法每天坚持写下一天计划 自我管理体系计划-行动-评价-回顾 一丶番茄时钟 一个计时器 一份任务清单,任务 步骤 每一个25分钟是一个番茄时钟 将工作时间划分为若干个25分钟的工作单元期间只专注于当前任务,遇到…

侯捷 C++ 课程学习笔记:深入理解 C++ 核心技术与实战应用

目录 引言 第一章&#xff1a;C 基础回顾 1.1 C 的历史与发展 1.2 C 的核心特性 1.3 C 的编译与执行 第二章&#xff1a;面向对象编程 2.1 类与对象 2.2 构造函数与析构函数 2.3 继承与多态 第三章&#xff1a;泛型编程与模板 3.1 函数模板 3.2 类模板 3.3 STL 容器…

SpringSecurity:There is no PasswordEncoder mapped for the id “null“

文章目录 一、情景说明二、分析三、解决 一、情景说明 在整合SpringSecurity功能的时候 我先是去实现认证功能 也就是&#xff0c;去数据库比对用户名和密码 相关的类&#xff1a; UserDetailsServiceImpl implements UserDetailsService 用于SpringSecurity查询数据库 Logi…

DeepSeek R1与OpenAI o1深度对比

文章目录 引言技术原理DeepSeek R1OpenAI o1 性能表现官方数据推理任务知识密集型任务通用能力 价格对比应用场景科研与技术开发自然语言处理&#xff08;NLP&#xff09;企业智能化升级教育与培训数据分析与智能决策 部署与集成DeepSeek R1OpenAI o1 伦理考量DeepSeek R1OpenA…

英语语法 第一天

I’m a student. 我是个学生 我是个新东方的学生 I’m a student of New Oriental School 我爱你 I love you 我在心中爱你 I love you in my heart. 这是一朵花 This is a flower 这是一朵在公园里的花 This is a flower in the park.(修饰部分在修饰词后面) 主干…

显示当前绑定变量

来自v$sql中的信息 测试两个变量的情况&#xff08;实际可以看6个&#xff0c;可根据需要修改&#xff09; DROP TABLE T1 PURGE; CREATE TABLE T1 AS SELECT A.*,SYSDATE RIQI FROM DBA_USERS A ORDER BY 1;var mc char(3); var id number; exec :mc:SYS; exec :id:50;set li…

FBX SDK的使用:基础知识

Windows环境配置 FBX SDK安装后&#xff0c;目录下有三个文件夹&#xff1a; include 头文件lib 编译的二进制库&#xff0c;根据你项目的配置去包含相应的库samples 官方使用案列 动态链接 libfbxsdk.dll, libfbxsdk.lib是动态库&#xff0c;需要在配置属性->C/C->预…

SpringBoot 基础(Spring)

SpringBoot 基础&#xff08;Spring) Bean 注解标记和扫描 (IoC) 配置类概念 SpringBootConfiguration 或者 Configuration 注解标注的类就是配置类配置类本身也会加入 IoC 容器* Configuration public class configuration1 {}SpringBootConfiguration public class configur…