【问题标题】:react + routing + security反应 + 路由 + 安全
【发布时间】:2016-11-13 20:45:24
【问题描述】:

我正在使用 React 和 react-router 构建一个 Web 应用程序,我想使用现有的外部访问管理基础架构 (OpenAM) 保护我的 React 应用程序的一些路由。

我想保护http://web.example.com:8080/myapp/#/user-profile url,这意味着只有登录的用户才能访问此路由。

我还有其他一些公开的路线,任何用户都可以打开它们,例如http://web.example.com:8080/myapp/#/welcome

访问管理保护 url,如果用户想要打开受保护的 url,则访问管理会显示一个登录表单,成功登录后将显示原始请求的 url。

这里的问题是 react-router 在 '#' 字符之后添加了路由信息,并且上面提到的两个不同的 url 从访问管理器的角度来看是相同的,因为它们引用了相同的 Web 资源(/myapp)。这两个 url 之间的区别出现在 '#' 字符之后。

我需要有没有像这样的“#”字符的真实网址:

有没有办法在 React 中使用真实的 url 映射? 你们有任何想法或解决方法如何使用真正的 url 路由和 react 吗?

谢谢。

更新: 这是我的代码。 Web 浏览器中的 url 看起来不错,但我收到“关于不匹配任何路由”的错误。请求网址:http://web.example.com:8080/myapp/about

import {Router, Route, IndexRoute, useRouterHistory} from 'react-router';
import {createHistory} from 'history';    

const browserHistory = useRouterHistory(createHistory) ({
   basename: '/myapp/'
});

ReactDOM.render(
   <Router history={browserHistory}>
      <Route path="/" component={MainLayout}>
         <IndexRoute component={Home} />
         <Route path="about" component={About} />
      </Route>
   </Router>
)

【问题讨论】:

  • react-router 支持像这样使用浏览器历史记录,但您必须配置服务器以提供正确的资源。
  • 你能告诉我们你的路线的相关线路吗? react-router 在其路由上支持 onEnter 道具。您可以编写一个每次点击时都会调用的函数。
  • 我将 history={browserHistory} 添加到我的路由器标签中,而 # 字符消失了。看起来很好。现在我有另一个问题。根 url 是 web.example.com:8080/myapp,欢迎内容链接到 web.example.com:8080/welcome 而不是 web.example.com:8080/myapp/welcome。呜呜呜……

标签: security reactjs react-router openam


【解决方案1】:

您可以按照 cmets 中的建议使用 browserHistory 来摆脱 # 符号。如果你希望你的 react-application 的根是 /myapp/ 而不是 / 你可以试试:

import {Router, Route, useRouterHistory} from 'react-router';
import {createHistory} from 'history';    

const browserHistory = useRouterHistory(createHistory)({basename: '/myapp/'});

ReactDOM.render(
  <Router history={browserHistory}>
    ...
  </Router>
)

【讨论】:

  • 感谢您的帮助。现在我在浏览器中看到的 url 看起来不错。当我单击主页链接时,会出现 web.example.com:8080/myapp。当我单击“关于”链接时,我可以在浏览器中看到 web.example.com:8080/myapp/about。但是映射有问题,因为“/about 与任何路由不匹配”错误出现在浏览器的控制台上。我已将我当前的路由代码添加到原始帖子中。我的映射有什么问题?谢谢。
  • @zappee,嗯,很奇怪。尝试将路线设置为&lt;Route path="/about" component={About} /&gt;。这行得通吗?
  • 很遗憾我无法关闭这个话题。路由逻辑有效,如果单击链接,我可以看到正确的内容,并且 url 看起来很漂亮。但我需要回到原来的问题 :( 我认为浏览器中出现的 url 只是一个假 url。当我想重新加载它时(web.example.com:8080/myapp/about)然后我得到一个 HTTP 404。所以 react-router只需将浏览器的 url 覆盖为“字符串”即可。
  • react-router 意味着不对服务器发出任何请求。这些确实是“假”网址。您需要适当地配置您的应用程序。例如,如果您请求 myapp/about,服务器必须始终像您请求 myapp/ 一样处理。这实际上取决于您的后端的工作方式,但这里有一个 good video 来帮助您入门。
  • 最后一步:使用 about 而不是 about 这样浏览器就会发送请求因此访问管理可以捕获请求并检查用户的登录状态。就是这样:)
猜你喜欢
  • 2020-09-08
  • 2016-07-15
  • 2018-12-30
  • 1970-01-01
  • 2019-02-18
  • 2018-11-05
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
相关资源
最近更新 更多