当前位置:首页 > 技术 > 正文内容

React应用中的路由权限管理

访客 技术 2026年7月3日 1

页面访问权限控制机制

  • 自定义权限路由组件实现方案
  • 基于官方文档构建AuthRoute权限控制组件
  • 登录成功后页面跳转逻辑优化

概述

现代Web应用通常包含两类功能页面:

功能分类:

  • 需要用户认证的功能(如:获取用户个人信息)
  • 公开访问的功能(如:浏览房产列表)

页面分类:

  • 需要登录才能访问的页面(如:用户个人中心)
  • 无需登录即可访问的页面(如:应用首页)

对于需要认证的功能,我们使用axios拦截器统一处理(如:添加认证请求头)。

对于需要认证的页面,我们使用路由守卫进行访问控制。

功能级权限控制 - 使用axios拦截器统一处理认证令牌

  1. 在API配置文件中添加请求拦截器
  2. 获取当前请求的URL路径
  3. 判断是否为需要认证的接口(例如:以/user开头,且非登录注册接口)
  4. 为需要认证的接口添加Authorization请求头
// 请求拦截器配置
API.interceptors.request.use(config => {
  const { url } = config
  // 判断是否需要认证
  if (
    url.startsWith('/user') &&
    !url.startsWith('/user/login') &&
    !url.startsWith('/user/register')
  ) {
    // 添加认证头
    config.headers.Authorization = getAuthToken()
  }
  return config
})
  1. 添加响应拦截器处理认证失败情况
  2. 检测返回状态码,识别令牌过期情况
  3. 令牌失效时清除本地认证信息
// 响应拦截器配置
API.interceptors.response.use(response => {
  const { status } = response.data
  if (status === 401) {
    // 令牌失效,清除认证信息
    removeAuthToken()
  }
  return response
})

页面级权限控制 - AuthRoute权限路由组件

实现原理

React路由本身不提供直接的权限控制组件,需要我们自定义实现类似Vue路由导航守卫的功能。AuthRoute本质上是对标准Route组件的封装,增加了权限验证逻辑。

使用示例:

核心实现逻辑:

  • 使用render props模式指定路由组件
  • 利用Redirect组件实现未认证用户的重定向
// 官方文档中的核心实现
function ProtectedRoute({ component: Component, ...rest }) {
  return (
    <Route
      {...rest}
      render={props =>
        // 检查认证状态
        authService.isAuthenticated() ? (
          <Component {...props} />
        ) : (
          <Redirect
            to={{
              pathname: "/signin",
              // 保存当前路径,用于登录后跳转
              state: { from: props.location }
            }}
          />
        )
      }
    />
  );
}

封装AuthRoute权限路由组件

  1. 在components目录下创建AuthRoute/index.js文件
  2. 创建并导出AuthRoute组件
  3. 在组件中返回Route组件并添加自定义渲染逻辑
  4. 在render方法中调用认证检查函数
  5. 根据认证状态决定渲染目标组件或重定向到登录页
  6. 将接收的props传递给Route组件,保持与标准Route一致的接口
const ProtectedRoute = ({ component: Component, ...rest }) => {
  return (
    <Route
      {...rest}
      render={props => {
        const isLoggedIn = checkAuthStatus()

        if (isLoggedIn) {
          // 已认证,渲染目标组件
          return <Component {...props} />
        } else {
          // 未认证,重定向到登录页
          return (
            <Redirect
              to={{
                pathname: '/signin',
                state: {
                  from: props.location
                }
              }}
            />
          )
        }
      }}
    />
  )
}
export default ProtectedRoute

优化登录成功后的跳转逻辑

  1. 登录成功后检查来源页面信息
  2. 如果没有来源页面信息,返回上一页
  3. 如果有来源页面信息,跳转到目标页面
  4. 推荐使用replace而非push进行页面跳转
// 登录表单提交处理
handleSubmit: async (values, { props }) => {
  ...
  if (status === 200) {
    // 保存认证令牌
    localStorage.setItem('app_token', response.token)

    /* 
      1. 检查是否有来源页面信息
      2. 无来源信息则返回上一页
      3. 有来源信息则跳转到目标页面
    */
    if (!props.location.state) {
      // 直接进入登录页,返回上一页
      props.history.go(-1)
    } else {
      // 使用replace模式跳转,避免历史记录堆积
      props.history.replace(props.location.state.from.pathname)
    }
  } else {
    // 登录失败处理
    Toast.error(message, 2)
  }
}

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。