React实现路由守卫

使用React实现路由守卫

关于路由守卫

Vue中内置了路由守卫,包括全局路由守卫、组件路由守卫、独享路由守卫,其中全局路由守卫又包括前置路由守卫和后置路由守卫,但是React并没有封装简单的API供用户使用。

使用场景

例如一个网站需要有主页和登录页,正常的交互逻辑:用户首次打开网站进入登录页,登录成功后才能进入首页,但是假如不对用户的操作作权限控制,用户可以通过手动改变url的方式进入首页,这对此网站来说显然是不安全的。所以就需要使用路由守卫在每次路由跳转之前进行权限校验,如果校验通过才允许跳转,否则系统重定向至登录页或首页(根据项目实际需求确定)

代码实现

  • Vue版本
    文件: /src/router/router.ts
import { createRouter, createWebHistory, RouteRecordName } from 'vue-router'
import cookie from 'js-cookie'
import { staticRoutes, asyncRoutes } from './static'
// 路由表白名单
const allowList:RouteRecordName[] = ['login']
const loginRoute = '/login'
const indexRoute = '/'
const router = createRouter({
  history: createWebHistory(),
  routes: [...staticRoutes, ...asyncRoutes],
  scrollBehavior: ()=>{ return { top: 0 }},
})
router.beforeEach((to, from, next) => {
  // 根据 token 对路由进行权限校验,需要和后端配合使用
  // 这里的 token 一般是登陆成功之后拿到后端返回的 token 并通过 Cookie.set('token', token字符串, {
  //    expires: time_limit // 设置存放时间
  // })设置
  const token = cookie.get('token');
  if (token && token !== 'undefined') {
  // 有 token 的状态下禁止用户回到登录页,重定向到首页
    if (to.path === loginRoute) {
      next({ path: indexRoute });
    } else {
    // 其他路由均可正常跳转
      next()
    }
  } else {
  // 无 token 的状态下,如果要跳转的路由是白名单中的路由,正常跳转
    if (allowList.includes(to.name || '')) {
      next()
    } else {
   // 无 token 且非白名单,重定向至登录页
      next({ path: loginRoute });
    }
  }
})

// 路由加载后
router.afterEach(() => {});

export default router;

最后在 main.ts 中引入

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'

const app = createApp(App);

app.use(router).mount('#app')

  • React版本
    虽然React没有路由守卫,但是我们可以通过高阶组件实现相关功能,使用方法如下:
    1. 在src/components/Auth下创建 AuthRoute.tsx 文件(位置可根据自己的习惯存放)
import React from 'react'
import {Navigate, useLocation} from "react-router-dom";
import Cookie from "js-cookie";

type RouteProps = {
    children?: React.ReactNode
}
const loginRoute = '/login'
const indexRoute = '/'
// 路由表白名单
const allowList = ['/login', '/register']

const AuthRoute: React.FC<RouteProps> = (props) => {
    const location = useLocation();
    // children 为子组件
    const {children} = props
    // 根据 token 对路由进行权限校验,需要和后端配合使用
    // 这里的 token 一般是登陆成功之后拿到后端返回的 token 并通过 Cookie.set('token', token字符串, {
    //    expires: time_limit // 设置存放时间
    // })设置
    let token = Cookie.get('token') 
    if (token && token !== 'undefined') {
        // 有 token 的状态下禁止用户回到登录页,重定向到首页
        if (location.pathname === loginRoute) {
            return <Navigate to={indexRoute}></Navigate>
        } else {
            // 其他路由均可正常跳转
            return <>{children}</>
        }
    } else {
        // 无 token 的状态下,如果要跳转的路由是白名单中的路由,正常跳转
        if (allowList.includes(location.pathname || '')) {
            return <>{children}</>
        } else {
            // 无 token 且非白名单路由,重定向至登录页
            return <Navigate to={loginRoute}></Navigate>
        }
    }
}
export default AuthRoute
  1. 在 App.tsx中引入并设置
// 引入路由表
import AppRouter from "@/router";
import {BrowserRouter} from 'react-router-dom';
// 引入实现路由鉴权的高阶组件
import AuthRoute from "@/components/Auth/AuthRoute";

const App = () => {
    return (
        <div className="App">
            <BrowserRouter>
                <AuthRoute>
                    <AppRouter/>
                </AuthRoute>
            </BrowserRouter>
        </div>
    )
}

export default App

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React实现路由守卫可以使用React Router库来帮助管理路由和导航。React Router提供了一种简单的方式来实现路由守卫,可以通过定义适当的组件来控制页面访问权限。 以下是一个基本的示例,展示了如何使用React Router实现路由守卫: 1. 首先,安装React Router库: ``` npm install react-router-dom ``` 2. 在你的应用程序中导入所需的模块: ```jsx import { BrowserRouter as Router, Route, Switch, Redirect } from 'react-router-dom'; ``` 3. 定义一个私有路由组件,用于验证用户是否有权限访问特定页面。需要传入以下参数:`component`(要渲染的组件)、`isAuthenticated`(表示用户是否已经登录)、`...rest`(其他包含路由参数的属性)。 ```jsx const PrivateRoute = ({ component: Component, isAuthenticated, ...rest }) => ( <Route {...rest} render={(props) => isAuthenticated ? ( <Component {...props} /> ) : ( <Redirect to="/login" /> // 没有权限,重定向到登录页面 ) } /> ); ``` 4. 在应用程序的根组件中设置路由和路由守卫。这将包裹整个应用程序,并根据需要定义私有和公共路由。 ```jsx const App = () => { const isAuthenticated = checkUserAuthentication(); // 检查用户是否已经登录 return ( <Router> <Switch> <Route exact path="/login" component={Login} /> // 公共路由,任何人都可以访问 <PrivateRoute path="/dashboard" component={Dashboard} isAuthenticated={isAuthenticated} // 私有路由,需要用户登录才能访问 /> </Switch> </Router> ); }; ``` 在上述代码中,`<PrivateRoute>` 组件用于保护需要用户登录才能访问的页面(例如仪表板)。如果用户未经身份验证,将重定向到登录页面。 请注意,上述示例中的 `checkUserAuthentication` 函数是一个示例,你需要根据实际需求自行实现。 这就是使用React Router实现基本的路由守卫的方法。你可以根据具体项目需求进行更复杂的路由守卫逻辑的实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值