如何设计路由权限?
(。・∀・)ノ゙嗨,我是你稳定更新、持续输出的勾勾。

新年快乐,我又来更新了~
今天的主题是路由权限。
对于 react 中的路由权限管理,react-router 并没有给我们提供任何 API 操作,需要我们单独封装一个组件。
对于路由的权限管理,我们要考虑的点很多,需要判断路由是否是根路由,是否是登录页,是否是需要登录权限的页面,是否是非法路由,然后根据不同的路径返回不同的组件或使用组件重定向路由。
先看我们项目下有哪些路由配置。
在 routes.js 中:
//统一管理路由import Home from "../Home/Home"import Login from "../Login/Login"import Pages from "../Pages/Pages";import News from "../News/News";import Users from "../Users/Users";import NotFound from "../404/404";export default [{path:"/",component:Home,exact:true},{path:"/login",component:Login,exact:true},{path:"/404",component:NotFound,exact:true},{path:"/pages",component:Pages,routes:[{path:"/pages/news",component:News},{path:"/pages/users",component:Users}]}]
通过上面的路由配置,我们看出,该项目下有四个路由分别是主页 home,登录 login,404 页,再加一个 pages 页。
对这四个路由我们分析如下:
404 和 login 是任何人都能看到的页面,home 和 pages 需要有登录状态
不在这个配置内的路由都是非法路由
那么通过这两点分析,我们实现一下路由权限管理的逻辑。
在项目下我们创建一个 Authcomponent.js 文件。
import React from "react"import { BrowserRouter as Router,Route,Redirect, Switch } from "react-router-dom"import routes from "../routes/routes"import Login from "../Login/Login"function Authcomponent(props){// console.log(props)const pathname = props.location.pathname; //获取pathnameconst targetRouter = routes.find((item,index)=>{return pathname.search(item.path) !== -1 //查找在routes.js下是否存在})const isLogin = JSON.parse(window.localStorage.getItem("loginStatus"))if(pathname == "/"){ //首页return <Redirect to="/login" component={Login}>Redirect>}if(!targetRouter){ //非法路由return <Redirect to = "/404">Redirect>}if(isLogin){ //有登录状态了if(pathname === "/login"){return <Redirect to="/home">Redirect>}else{return ()}}else{ //没有登录状态if(targetRouter.auth){ //该页面是否要权限return}else{console.log(targetRouter.routes)return ()}}}export default Authcomponent;
这样我们就把整个路由的权限统一管理起来,每一次的路由的跳转都要去做一次权限判断。所以我们把这个权限组件写在 App.js 中。
import Authcomponent from "./Authcomponent.js";function App(props) {console.log(window)return (<Router><Switch><Authcomponent>Authcomponent>Switch>Router>);}export default App;
这样就保证了每次我们在页面进行路由跳转的时候,就会去这个 Authcomponent.js 中进行路由权限判定,从而实现对这个页面的保护。
推荐阅读:
前端人因为 Vue3 的 Ref-sugar 提案打起来了!
点点“赞”和“在看”,保护头发,减少bug。
评论
