【问题标题】:How to prevent certain users from accessing a route and any subroutes in React?如何防止某些用户访问 React 中的路由和任何子路由?
【发布时间】:2019-11-22 06:20:01
【问题描述】:

阻止特定用户访问react-router 中的路由及其任何子路由的最佳方法是什么?

例如我有一条路线/admin/,它还有许多其他子路线,例如/admin/create-user/admin/settings 等。

是否有另一种方法可以阻止用户访问这些路由而不在每个组件上指明类似的条件?

if (user.role.name !== "Admin") {
    return (
      <div className="error-page">
        <h1>Sorry, you don't have rights to access this page.</h1>
     </div>
    );
  } else {
  // render admin component
}

【问题讨论】:

    标签: javascript reactjs react-router authorization


    【解决方案1】:

    您需要使用自定义的 ProtectedRoute 组件,并将所需的角色传递给此组件,无论用户是否可以转到该路由。

    代码沙盒:

    https://codesandbox.io/s/so-protect-route-roles-z7j3l

    ProtectedRoute.js:

    import React from "react";
    import { Route, Redirect } from "react-router-dom";
    import {user} from "./AuthService";
    
    export const ProtectedRoute = ({
      path,
      component: Component,
      render,
      requiredRole,
      ...rest
    }) => {
    
      return (
        <Route
          path={path}
          {...rest}
          render={props => {
            if (user.role.name === requiredRole) {
              return Component ? <Component {...props} /> : render(props);
            } else {
              return <Redirect to="/error" />;
            }
          }}
        />
      );
    };
    
    export default ProtectedRoute;
    

    AuthService 就是这么简单,你需要修改它来满足你的需求。

    AuthService.js(你可以把角色改成Admin来玩)

    export const user = {
      name: "User 1",
      role:{
        name: "User"
      }
    }
    

    App.js(请注意,我们使用了 ProtectedRoute 组件,并将所需的角色传递给它)

    import React, { Component } from "react";
    import { BrowserRouter as Router, Link, Route } from "react-router-dom";
    import Home from "./Home";
    import User from "./User";
    import Admin from "./Admin";
    import Login from "./Login";
    import ErrorPage from "./ErrorPage";
    import ProtectedRoute from "./ProtectedRoute";
    
    class App extends Component {
      render() {
        return (
          <Router>
            <div>
              <ul>
                <li>
                  <Link to="/">Home</Link>
                </li>
                <li>
                  <Link to="/user">User</Link>
                </li>
                <li>
                  <Link to="/admin">Admin</Link>
                </li>
              </ul>
    
              <Route exact path="/" component={Home} />
              <Route exact path="/login" component={Login} />
              <Route exact path="/error" component={ErrorPage} />
              <ProtectedRoute path="/user" component={User} requiredRole="User" />
              <ProtectedRoute path="/admin" component={Admin} requiredRole="Admin" />
            </div>
          </Router>
        );
      }
    }
    
    export default App;
    
    

    使用此设置,没有管理员角色的用户无法导航到管理员及其嵌套路由。

    【讨论】:

      【解决方案2】:

      使用如图所示的Route组件

      if(user.role.name !== "Admin") {
         <Route path="/admin" component={Admin} />
      } else {
         <Redirect to="/" />
      }
      

      如果管理员显示组件,否则重定向到主页。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-08
        • 1970-01-01
        • 2021-10-30
        • 2017-04-16
        • 2021-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多