React实战 - React路由鉴权

news2024/9/28 13:22:37

目录

一、React-Router知识回顾

二、路由鉴权应用分析

三、路由鉴权配置

四、权限控制


一、React-Router知识回顾

React-router相关的文章中我已经给大家演示了最基础的应用:

<Switch >
    <Route path="/products/:id" component={ProductDetails} />
    <Redirect from="/mall" to="/products" />
    <Route path="/products" render={( props ) => <Products groupId="99" {...props} />} />
    <Route path="/posts/:year?/:month?" component={Posts} />
    <Route path="/admin" component={Dashboard} />
    <Route path="/not-found" component={NotFound} />
    <Route path="/" exact component={Home} />
    <Redirect to="/not-found" />
</Switch>

<Switch>: 渲染与该地址匹配的第一个子节点  或者 

<Route>: 是用于声明路由映射到应用程序的组件层

<Redirect>: 在应用中可以设置重定向到其他 route,默认要设置to(目标),可以设置from(从哪个路由)

< Link>: 允许用户浏览应用的主要方式。会去渲染一个可访问的锚标签。

<NavLink>: 一个特殊版本的 Link,当它与当前 URL 匹配时,为其渲染元素添加样式属性。

<Router>: Router 是所有路由组件共用的底层接口。通常,我们的应用程序将使用其中一个高级路由器代替:

<BroswerRouter>或<HashRouter>,使用Router将组件包装起来,保持UI和URL的同步

<BrowserRouter>
    <App />
</BrowserRouter>

二、路由鉴权应用分析

可以画一个简单的图,将页面、路由、权限做一个整理

所以我们可以将路由分为:

一层路由: /、/login、/not-found、/backend

二层路由:/backend/product、/backend/users、/backend/admin

根据需要的页面我们可以搭建出管理应用的工程目录结构出来,大致的结构可以是这样设计的

三、路由鉴权配置

首先我们创建一个配置js文件,用于存放之前我们分析的两种路由配置,另外由于管理后台的菜单路由也是关联的,也同时要创建一个导航的配置

import Home from "../components/home";
...

/* 第一层路由 */
const routes = [
  {
    path: "/",
    exact: true,
    component: Home,
  },
  {
    path: "/login",
    component: Login,
  },
  {
    path: "/backend",
    component: MyLayout,
  },
  {
    path: "/not-found",
    component: NotFound,
  },
];

/* 第二层路由 */
const componentsRoutes = [
  {
    key: "backend",
    path: "/backend",
    exact: true,
    component: Backend,
  },
  {
    key: "product",
    path: "/backend/product",
    component: Product,
  },
  {
    key: "users",
    path: "/backend/users",
    component: Users,
  },
  {
    key: "admin",
    path: "/backend/admin",
    component: Admin,
  },
];

/* 菜单导航 */
const navi = [
  {
    title: "课程",
    key: "product",
    path: "/backend/product",
  },
  {
    title: "用户",
    key: "users",
    path: "/backend/users",
  },
  {
    title: "后台",
    key: "admin",
    path: "/backend/admin",
  },
];

export { routes, componentsRoutes, navi };

关于配置的属性值其实就是React-router所需要的传入参数,包括key,path,exact,component,而导航是配置了三个属性:title(导航名称),key和对应的path

有了配置之后,就需要把配置在组件内做渲染,这时就需要定义一个通用的函数,它的输入就是上面的配置对象,而输入则是React-router组件

import React from "react";
import { Route, Switch, Redirect } from "react-router-dom";

const renderRoutes = (routes, switchProps = {}) => {
  return (
    <Switch {...switchProps}>
      {routes.map((route, i) => (
        <Route
          key={route.key || i}
          path={route.path}
          exact={route.exact}
          strict={route.strict}
          render={(props) => (
            <route.component {...props} {...route.extraProps} route={route} />
          )}
        />
      ))}
      <Redirect to="/not-found" />
    </Switch>
  );
};

export default renderRoutes;

定义了方法之后,就可以做路由的配置了,我们首先在App组件中做第一层的路由配置

<div className="App">
   {renderRoutes(routes)}
</div>

对于管理后台中的路由加载,我们需要在layout的组件中去做第二层的路由配置,首先我们来渲染左侧的导航菜单

//定义导航渲染函数
renderMenu = () =>{
    return navi.map(item => {
      return <MenuItem key={item.key}><NavLink to={item.path}>{item.title}</NavLink></MenuItem>
    })
}
//在menu中渲染
<Menu>
  {this.renderMenu()}
</Menu>

和渲染第一层的路哟一样,我们再将第二层定义的路由对象componentsRoutes使用renderRoutes方法渲染到页面上。这样我们的路由配置部分就完成了

四、权限控制

一般来说权限的处理方法:

无权限重定向: 可以定向到登录或提示页面

无权限提示: 提示没有权限查看页面

无权限隐藏: 直接隐藏无权限项

做权限控制的思路也很简单,先设置每个页面或组件的对应角色权限,然后判断当前用户角色是否符合,来决定要不要做路由渲染

 有了这样的思路,我们就先来对路由配置文件添加permission属性,来控制每个页面和组件的权限

import Home from "../components/home";
...

const routes = [
  {
    path: "/",
    exact: true,
    component: Home,
    permission: [1,2,3]
  },
  {
    path: "/login",
    component: Login,
    permission: [1,2,3]
  },
  {
    path: "/backend",
    component: MyLayout,
    permission: [2,3]
  },
  {
    path: "/not-found",
    component: NotFound,
    permission: [1,2,3]
  },
];

const componentsRoutes = [
  {
    key: "backend",
    path: "/backend",
    exact: true,
    component: Backend,
    permission: [2,3]
  },
  {
    key: "product",
    path: "/backend/product",
    component: Product,
    permission: [2,3]
  },
  {
    key: "users",
    path: "/backend/users",
    component: Users,
    permission: [2,3]
  },
  {
    key: "admin",
    path: "/backend/admin",
    component: Admin,
    permission: [3]
  },
];

const navi = [
  {
    title: "课程",
    key: "product",
    path: "/backend/product",
    permission: [2,3]
  },
  {
    title: "用户",
    key: "users",
    path: "/backend/users",
    permission: [2,3]
  },
  {
    title: "后台",
    key: "admin",
    path: "/backend/admin",
    permission: [3]
  },
];

export { routes, componentsRoutes, navi };

接着思路,接下来就要是将renderRoutes这个方法做一些改变

import React from "react";
import { Route, Switch, Redirect } from "react-router-dom";

const auth = window.user.data

const renderRoutes = (routes, switchProps = {}) => {
  let routers = []

  routes.forEach( (route, i)  => {
    if(route.permission.indexOf(auth) >= 0){
      routers.push(
        <Route
          key={route.key || i}
          path={route.path}
          exact={route.exact}
          strict={route.strict}
          render={(props) => (
            <route.component {...props} {...route.extraProps} route={route} />
          )}
        />
      )
    }else{
      routers.push(
        <Redirect key={route.key || i} from={route.path} to="/login" />
      )
    }
  });
  
  return (
    <Switch {...switchProps}>
      {routers}
      <Redirect to="/not-found" />
    </Switch>
  );
};

export default renderRoutes;

接下来设置一下导航,将导航设置为无权限隐藏,当没有权限的时候,就不渲染相关的菜单即可

renderMenu = () =>{
    return navi.map(item => {
      return item.permission.indexOf(auth) >=0 ? 
       <MenuItem key={item.key}><NavLink to={item.path}>{item.title}</NavLink></MenuItem> :  null;
    })
  }

 最后我们需要设置一下首页的按钮,根据不同的权限去定向不同的页面就可以了

 handleEnter = () => {
    if(auth === 1){
      window.location.href = "/login"
    }else{
      window.location.href = "/backend"
    }
  }

  render() { 
    return ( 
      <div className="home">
        <Button onClick={this.handleEnter} className="enter-btn" type="primary" size="large" >点击进入</Button>
      </div>
     );
  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/906773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Rust】Rust学习 第十七章Rust 的面向对象特性

面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种模式化编程方式。对象&#xff08;Object&#xff09;来源于 20 世纪 60 年代的 Simula 编程语言。这些对象影响了 Alan Kay 的编程架构中对象之间的消息传递。他在 1967 年创造了 面向对…

Blob,File文件上传下载的内容笔记

Blob 对象表示一个不可变、原始数据的类文件对象&#xff0c;可以看做是存放二进制数据的容器 。 简单来说Blob就是一个二进制的对象&#xff0c;我们可以通过这个blob对象直接读取文件内容 Blob和Flie没什么区别&#xff0c;File继承于Blob,就是多了一个name属性&#xff0c;表…

当今职场,正在加速淘汰 “巨婴员工”

我担任过多家上市公司的技术高管职位&#xff0c;在工作中经常会遇到巨婴型员工&#xff0c;他们外在的表现是&#xff0c;不能够很好地管理自己&#xff0c;缺乏自律&#xff0c;缺乏起码的抗挫折能力和抗压能力&#xff0c;需要领导呵护着、同事们忍让着。作为一名管理者&…

科技成果鉴定测试有什么意义?专业CMA、CNAS软件测评公司

科技成果鉴定测试是指通过一系列科学的实验和检测手段&#xff0c;对科技成果进行客观评价和鉴定的过程。通过测试&#xff0c;可以对科技成果的技术优劣进行评估&#xff0c;从而为科技创新提供参考和指导。 一、科技成果鉴定测试的意义 1、帮助客户了解科技产品的性能特点和…

排序(七种排序)

1.插入排序 2.希尔排序 3.选择排序 4.堆排序 5.冒泡排序 6.快速排序 7.归并排序 1.插入排序 1.1思路 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为 止&#xff0c;得到一个新的有序序列 1.2实现 //插入排…

[计算机入门] 个性化设置系统

3.2 个性化设置系统 在Windows系统中&#xff0c;个性化设置可以让用户根据自己的喜好和需求对系统进行定制和调整&#xff0c;包括桌面背景、声音、屏幕保护程序、鼠标指针、字体等。通过个性化设置&#xff0c;用户可以创建自己的独特界面和用户体验&#xff0c;使系统更加符…

HBuilderX获取iOS证书的打包步骤

简介&#xff1a; 目前app开发&#xff0c;很多企业都用H5框架来开发&#xff0c;而uniapp又是这些h5框架里面最成熟的&#xff0c;因此hbuilderx就成为了开发者的首选。然而,打包APP是需要证书的&#xff0c;那么这个证书又是如何获得呢&#xff1f; 生成苹果证书相对复杂一些…

Hyper-V Linux服务器安装

官方文档&#xff1a;在 Windows 10 创意者更新上使用 Hyper-V 创建虚拟机 | Microsoft Learn 1 新增虚拟交换机 打开Hyper-V管理器&#xff0c;找到右侧的操作列&#xff0c;点击“虚拟交换机管理器”&#xff1a; 点击“新建虚拟网络交换机”&#xff0c;交换机类型选择“外部…

用idea解决代码合并冲突

参考文章&#xff1a; IDEA&#xff1a;idea中的Git冲突解决&#xff08;非常重要&#xff09; idea操作git时 合并分支解决冲突 一、前言 1.什么事冲突&#xff1f; 冲突是指当你在提交或者更新代码时被合并的文件与当前文件不一致。读起来有点绕&#xff0c;结合下面的案例…

16、Flink 的table api与sql之连接外部系统: 读写外部系统的连接器和格式以及FileSystem示例(1)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

Unity解决:3D开发模式第三人称视角 WASD控制角色移动旋转 使用InputSystem

Unity版本&#xff1a;2019.2.3f1 目录 安装InputSystem 1&#xff1a;创建InputHander.cs脚本 挂载到Player物体上 获取键盘输入WADS 2.创建PlayerLocomotion.cs挂载到Player物体上&#xff0c;控制物体移动转向 安装InputSystem 菜单栏/Window/Package Manager/Input Syst…

AI图片处理功能演示

例如&#xff0c;这是一张不错的图片&#xff0c;但是有3只手。 我们可以选择有问题的区域&#xff0c;然后要求 niji 进行重新绘制。 根据我们选择的区域&#xff0c;我们可以以不同的方式修复结果。 创意修复 修复并不仅限于纠正错误。我们可以要求 niji 添加额外的元素&…

MATLAB R2023a for Mac Update_5

MATLAB是一种高级的计算机编程环境和开发工具&#xff0c;主要用于数值计算、数据分析、算法开发和可视化。它由MathWorks公司开发&#xff0c;被广泛应用于科学研究、工程设计、数据分析和教育等领域。 MATLAB提供了丰富的数学和工程函数库&#xff0c;可以进行矩阵运算、信号…

跨域资源共享 (CORS) | PortSwigger(burpsuite官方靶场)【万字】

写在前面 在开始之前&#xff0c;先要看看ajax的局限性和其他跨域资源共享的方式&#xff0c;这里简单说说。 下面提到大量的origin&#xff0c;注意区分referer&#xff0c;origin只说明请求发出的域。 浏览器的同源组策略&#xff1a;如果两个 URL 的 protocol、port 和 h…

所见即所得,「Paraverse平行云」助力万间打造智能建造新图景

在城市建设行业中&#xff0c;数字化逐渐成为其主导力量。 新一代信息基础设施建设也迎来了新的里程碑。数据显示&#xff0c;截至今年&#xff0c;我国已全面推进城市信息模型&#xff08;CIM&#xff09;基础平台建设&#xff0c;为城市规划、建设管理提供了多场景应用的强大…

【Python】代理池针对ip拦截破解

代理池是一种常见的反反爬虫技术&#xff0c;通过维护一组可用的代理服务器&#xff0c;来在被反爬虫限制的情况下&#xff0c;实现数据的爬取。但是&#xff0c;代理池本身也面临着被目标网站针对ip进行拦截的风险。 本文将详细介绍代理池针对ip拦截破解的方法&#xff0c;包含…

小研究 - Android 字节码动态分析分布式框架(三)

安卓平台是个多进程同时运行的系统&#xff0c;它还缺少合适的动态分析接口。因此&#xff0c;在安卓平台上进行全面的动态分析具有高难度和挑战性。已有的研究大多是针对一些安全问题的分析方法或者框架&#xff0c;无法为实现更加灵活、通用的动态分析工具的开发提供支持。此…

colab释放GPU显存

不用其他博客说的安装包&#xff0c;然后查看进程&#xff0c;kill&#xff0c;本文介绍一种简单的方法。 点击运行过代码的ipynb页面右上角的下三角&#xff0c;然后点击展开菜单栏中的View resources 随后会展开一个侧边栏&#xff0c;点击 manage sessions 3. 在页面中央会…

十问华为云 Toolkit:开发插件如何提升云上开发效能

众所周知&#xff0c;桌面集成开发环境&#xff08;IDE&#xff09;已经融入到开发的各个环节&#xff0c;对开发者的重要性和广泛度是不言而喻的&#xff0c;而开发插件更是建立在IDE基础上的功能Buff。 Huawei Cloud ToolKit作为华为云围绕其产品能力向开发者桌面上的延伸&a…

CentOS系统环境搭建(十六)——es7安装ik分词器(纯命令行安装)

centos系统环境搭建专栏&#x1f517;点击跳转 关于Elasticsearch的安装请看CentOS系统环境搭建&#xff08;十二&#xff09;——CentOS7安装Elasticsearch。 es7安装ik分词器&#xff08;纯命令行安装&#xff09; 1.找版本 我的Elasticsearch是7.17.6的&#xff0c;下载ik…