React Router v6配置路由守卫

首先准备好以下页面

登录页:用户可以在此页面登录。

受保护页:只有登录的用户可以访问,否则会重定向到登录页。

公共页面:不需要鉴权,任何人都可以访问。

  1. 安装依赖

首先,我们需要安装 react-router-dom:

npm install react-router-dom

  1. 设置鉴权逻辑

使用 React Context 来管理用户的登录状态(模拟鉴权)。创建一个简单的 AuthContext 来保存和提供用户的登录信息。

javascript 复制代码
//AuthContext.js

import 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>
  );
};
  1. 配置路由守卫

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

javascript 复制代码
//PrivateRoute.js

import 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;
  1. 创建页面组件

需要三个页面:登录页、受保护页和公共页面。

javascript 复制代码
//LoginPage.js

import 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>
      <input
        type="text"
        placeholder="Enter username"
        value={username}
        onChange={(e) => setUsername(e.target.value)}
      />
      <button onClick={handleLogin}>Login</button>
    </div>
  );
};

export default LoginPage;
javascript 复制代码
//ProtectedPage.js

import 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;
javascript 复制代码
//PublicPage.js

import React from 'react';

const PublicPage = () => {
  return (
    <div>
      <h2>Public Page</h2>
      <p>This page is accessible to everyone.</p>
    </div>
  );
};

export default PublicPage;
  1. 配置路由

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

javascript 复制代码
//App.js

import 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 保护受保护页 */}
          <Route
            path="/protected"
            element={<PrivateRoute element={<ProtectedPage />} />}
          />
        </Routes>
      </Router>
    </AuthProvider>
  );
};

export default App;
  1. 代码解释

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 应用,适合大部分的需求。

相关推荐
索然无味io1 分钟前
组件框架漏洞
前端·笔记·学习·安全·web安全·网络安全·前端框架
╰つ゛木槿10 分钟前
深入探索 Vue 3 Markdown 编辑器:高级功能与实现
前端·vue.js·编辑器
yqcoder29 分钟前
Commander 一款命令行自定义命令依赖
前端·javascript·arcgis·node.js
前端Hardy1 小时前
HTML&CSS :下雪了
前端·javascript·css·html·交互
醉の虾1 小时前
VUE3 使用路由守卫函数实现类型服务器端中间件效果
前端·vue.js·中间件
码上飞扬2 小时前
Vue 3 30天精进之旅:Day 05 - 事件处理
前端·javascript·vue.js
火烧屁屁啦2 小时前
【JavaEE进阶】应用分层
java·前端·java-ee
程序员小寒2 小时前
由于请求的竞态问题,前端仔喜提了一个bug
前端·javascript·bug
赵不困888(合作私信)3 小时前
npx和npm 和pnpm的区别
前端·npm·node.js
很酷的站长4 小时前
一个简单的自适应html5导航模板
前端·css·css3