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

如何在React Router 4中实现经过身份验证的路由?

冯哲彦
2023-03-14
问题内容

我试图实现经过身份验证的路由,但是发现React Router 4现在阻止了它的工作:

<Route exact path="/" component={Index} />
<Route path="/auth" component={UnauthenticatedWrapper}>
    <Route path="/auth/login" component={LoginBotBot} />
</Route>
<Route path="/domains" component={AuthenticatedWrapper}>
    <Route exact path="/domains" component={DomainsIndex} />
</Route>

错误是:

警告:您不应使用<Route component><Route children>在同一路线上;<Route children>将被忽略

在这种情况下,实现此目标的正确方法是什么?

它出现在react-router(v4)文档中,提示类似

<Router>
    <div>
    <AuthButton/>
    <ul>
        <li><Link to="/public">Public Page</Link></li>
        <li><Link to="/protected">Protected Page</Link></li>
    </ul>
    <Route path="/public" component={Public}/>
    <Route path="/login" component={Login}/>
    <PrivateRoute path="/protected" component={Protected}/>
    </div>
</Router>

但是在将一堆路线组合在一起时是否有可能实现这一目标?

更新

好吧,经过一番研究,我想到了这个:

import React, {PropTypes} from "react"
import {Route} from "react-router-dom"

export default class AuthenticatedRoute extends React.Component {
  render() {
    if (!this.props.isLoggedIn) {
      this.props.redirectToLogin()
      return null
    }
    return <Route {...this.props} />
  }
}

AuthenticatedRoute.propTypes = {
  isLoggedIn: PropTypes.bool.isRequired,
  component: PropTypes.element,
  redirectToLogin: PropTypes.func.isRequired
}

发出错误的动作是正确的render()感觉。似乎确实不正确,componentDidMount还是带有其他挂钩?


问题答案:

您将要使用该Redirect组件。有几种不同的方法可以解决此问题。我喜欢的一个是,有一个PrivateRoute组件,该组件接受一个authed道具,然后根据该道具进行渲染。

function PrivateRoute ({component: Component, authed, ...rest}) {
  return (
    <Route
      {...rest}
      render={(props) => authed === true
        ? <Component {...props} />
        : <Redirect to={{pathname: '/login', state: {from: props.location}}} />}
    />
  )
}

现在你Route的可以看起来像这样

<Route path='/' exact component={Home} />
<Route path='/login' component={Login} />
<Route path='/register' component={Register} />
<PrivateRoute authed={this.state.authed} path='/dashboard' component={Dashboard} />

如果您仍然感到困惑,我写了这篇文章可能会有所帮助 -React Router
v4的受保护路由和身份验证



 类似资料:
  • 我试图实现身份验证的路由,但发现React路由器4现在阻止此工作: 错误是: 警告:您不应使用

  • Flatter Web(Navigator 2.0/Router API):如何处理经过身份验证的路由及其成功身份验证后的重定向? e、 g.我的系统中有这种路由 若用户直接打开这个URL,我想让用户先登录,那个么路由将被重定向到。。 一旦登录,我想用户导航以前打开的网址,如果有任何其他主页。。 似乎这种事情可能会有所帮助,任何想法——我们如何才能实现类似的事情?https://stackover

  • 问题内容: 我正在运行此节点服务器: 我想为此服务器添加登录表单。因此,当用户通过身份验证时,它将显示。 进程中查询功能,如果未提供任何命令,则将文件返回给客户端,因此我可以将登录命令从客户端发送到服务器,但是当服务器接收到带有用户名密码的登录命令时,服务器应如何处理,应如何处理登录请求并返回登录成功或失败的信息,编写此部分需要帮助。 我试过了。 请建议我该如何添加会话,我尝试在登录功能中添加,请

  • 我的代码在这里:代码重新发布是因为我想问一个更直接的问题。如何在未经身份验证的用户和经过身份验证的用户之间切换?我的未经验证的文件似乎已缓存,我使用了以下方法: 在我剩下的api代码之前,它仍然不能工作。谢谢你的帮助 注意:我知道它不起作用,因为我在切换配置/凭据提供程序后立即使用lambda进行调用,并且只有授权用户才能调用此方法。 编辑@behrooziAWS答案: API代码: 完整错误:B

  • 问题内容: 我对问题不是很具体(希望通过与Scrapy进行身份验证的会话进行抓取),希望能够从更笼统的答案中得出解决方案。我应该宁可使用这个词。 所以,这是到目前为止的代码: 如你所见,我访问的第一页是登录页面。如果尚未通过身份验证(在函数中),则调用自定义函数,该函数将发布到登录表单中。然后,如果我我验证,我想继续爬行。 问题是我尝试覆盖以登录的功能,现在不再进行必要的调用以刮擦任何其他页面(我

  • 我正在react路由器v4上实现受保护的路由。我试图将“isAuthenticated”值从“Login”组件传递到“Authenticated”组件,但得到“false”值。 也许我用错了方法,任何人都可以帮助解决这个问题吗? 我的代码如下: 登录。js提供“isAuthenticated”控件 Authenticated.js需要获得“isAuthenticated”值(true)来呈现受保护