当前位置: 首页 > 面试题库 >

如何在react-router中限制对路由的访问?

罗昱
2023-03-14
问题内容

有谁知道如何在react-router中限制对特定路由的访问?我想在允许访问特定路由之前检查用户是否已登录。我以为这很简单,但是文档尚不清楚该怎么做。

这是我应该在定义<Route>组件的位置设置的东西,还是应该在组件处理程序中处理的东西?

<Route handler={App} path="/">
  <NotFoundRoute handler={NotFound} name="not-found"/>
  <DefaultRoute handler={Login} name="login"/>
  <Route handler={Todos} name="todos"/> {/* I want this to be restricted */}
</Route>

问题答案:

更新(2019年8月16日)

在react-router v4和使用React Hooks中,这看起来有些不同。让我们从开始App.js

export default function App() {
  const [isAuthenticated, userHasAuthenticated] = useState(false);

  useEffect(() => {
    onLoad();
  }, []);

  async function onLoad() {
    try {
      await Auth.currentSession();
      userHasAuthenticated(true);
    } catch (e) {
      alert(e);
    }
  }

  return (
    <div className="App container">
      <h1>Welcome to my app</h1>
      <Switch>
        <UnauthenticatedRoute
          path="/login"
          component={Login}
          appProps={{ isAuthenticated }}
        />
        <AuthenticatedRoute
          path="/todos"
          component={Todos}
          appProps={{ isAuthenticated }}
        />
        <Route component={NotFound} />
      </Switch>
    </div>
  );
}

我们正在使用一个Auth库来检查用户当前是否已通过身份验证。将其替换为您的身份验证检查功能。如果是这样,则将isAuthenticated标志设置为true。我们在应用程序首次加载时执行此操作。同样值得一提的是,您可能希望在运行身份验证检查时在应用程序上添加加载标志,因此您不必在每次刷新页面时都刷新登录页面。

然后我们将标志传递到路线。我们创建两种类型的路线AuthenticatedRouteUnauthenticatedRoute

AuthenticatedRoute.js看起来像这样。

export default function AuthenticatedRoute({ component: C, appProps, ...rest }) {
  return (
    <Route
      {...rest}
      render={props =>
        appProps.isAuthenticated
          ? <C {...props} {...appProps} />
          : <Redirect
              to={`/login?redirect=${props.location.pathname}${props.location.search}`}
            />}
    />
  );
}

它检查是否isAuthenticated设置为true。如果是的话,它将渲染所需的组件。如果没有,它将重定向到登录页面。

UnauthenticatedRoute.js另一方面,看起来是这样的。

export default ({ component: C, appProps, ...rest }) =>
  <Route
    {...rest}
    render={props =>
      !appProps.isAuthenticated
        ? <C {...props} {...appProps} />
        : <Redirect to="/" />}
  />;

在这种情况下,如果将isAuthenticated设置为false,它将呈现所需的组件。如果将其设置为true,它将带您进入主页。

您可以在我们的指南中找到其详细版本-https: //serverless-stack.com/chapters/create-a-route-that-
redirects.html

旧版

可接受的答案是正确的,但React团队认为Mixins是有害的(https://facebook.github.io/react/blog/2016/07/13/mixins-
considered-
harmful.html

)。

如果有人遇到此问题,并正在寻找推荐的方法来执行此操作,则建议使用高阶组件而不是Mixins。

这是一个HOC的示例,该HOC会在继续操作之前检查用户是否已登录。如果用户未登录,它将把您重定向到登录页面。该组件采用一个名为的道具isLoggedIn,该道具基本上是一个标志,应用程序可以存储该标志以表示用户是否已登录。

import React from 'react';
import { withRouter } from 'react-router';

export default function requireAuth(Component) {

  class AuthenticatedComponent extends React.Component {

    componentWillMount() {
      this.checkAuth();
    }

    checkAuth() {
      if ( ! this.props.isLoggedIn) {
        const location = this.props.location;
        const redirect = location.pathname + location.search;

        this.props.router.push(`/login?redirect=${redirect}`);
      }
    }

    render() {
      return this.props.isLoggedIn
        ? <Component { ...this.props } />
        : null;
    }

  }

  return withRouter(AuthenticatedComponent);
}

要使用此HOC,只需将其包裹在您的路线周围即可。以您的示例为例:

<Route handler={requireAuth(Todos)} name="todos"/>

我在这里的详细分步教程中介绍了此主题以及其他一些主题-https: //serverless-stack.com/chapters/create-a-
hoc-that-c​​hecks-auth.html



 类似资料:
  • 问题内容: 有没有办法在React Router v4中嵌套路由? 这有效: 这不是: 客户组成部分: 问题答案: 到目前为止,我发现的最佳模式。 我可以继续将其嵌套在组件中,并且一切都很好,包括hmr(如果使用webpack,请不要忘记设置为)

  • 问题内容: 我正在React-Router中设置一些嵌套路由(我正在使用v0.11.6),但是每当我尝试访问其中一个嵌套路由时,都会触发父路由。 我的路线如下所示: 如果我将路线折叠起来,它看起来像: 它工作正常。之所以要嵌套,是因为我将在“仪表盘”下有多个子代,并希望它们在URL中都带有前缀。 问题答案: 配置与路由无关(尽管有名称),而是与路径驱动的布局有关。 因此,使用此配置: 就是说要嵌入

  • 问题内容: 我已经在应用程序中将React Router升级到了版本4。但是现在我得到了错误 此路由有什么问题? 问题答案: IndexRoute和browserHistory在最新版本中不可用,并且Routes不接受带有v4的子级Routes,您可以在组件本身中指定Routes 然后在主要部分 同样在汽车组件中 您将拥有

  • 我有类似这样的App.js文件 而看起来是这样的 我需要使,和工作 我尝试了上述方法,但输出是空白的,当我去任何这些路线。只有Navbar被渲染。

  • 本文向大家介绍vue-router 控制路由权限的实现,包括了vue-router 控制路由权限的实现的使用技巧和注意事项,需要的朋友参考一下 注意:vue-router是无法完全控制前端路由权限。 1、实现思路 使用vue-router实例函数addRoutes动态添加路由规则,不多废话直接上思维导图: 2、实现步骤 2.1、路由匹配判断 通过vue-router前置守卫beforeEach中参

  • 问题内容: 我有一个如下的路由器: 这是我要实现的目标: 将用户重定向到(如果未登录) 如果用户在已经登录时尝试访问,请将其重定向到root 所以现在我想以检查用户的状态的,然后做一些事情,如: 这里的问题是我找不到获取当前路由的API。 我发现建议使用Router.ActiveState mixin和路由处理程序来解决此已关闭的问题,但是现在似乎已弃用了这两个解决方案。 问题答案: 阅读更多文档