延迟加载组件需要使用react-redux进行身份验证

lgp*_*ale 7 jwt reactjs webpack redux

我正在尝试使用react + redux创建一个网站.我已经在服务器上设置了jwt身份验证.我想做的是延迟加载我的一些组件/容器和reducer,以便只有经过身份验证的用户才能下载它们.我已经知道如何从未经身份验证的用户(客户端)隐藏组件,但我宁愿阻止他们下载相关的javascript代码.

我正在使用webpack,我已经研究过react-router和require-ensure(/sf/answers/2313129101/),但这种方法似乎根本不处理身份验证.我也考虑过fetch以某种方式使用(可能是将私有代码与webpack分开捆绑),但是一旦我获取它,我就不知道该如何处理它.

我是以错误的方式解决问题了吗?我看到的唯一选择是提供两个HTML文件,一个加载仅包含公共内容的webpack包,另一个下载私有代码.然而,这看起来真的不是最理想的.什么是正确的方法?

小智 1

我们通过使用react-router解决了这个问题:

<Route 
    key="secured_component" 
    path="/secured" 
    onEnter={handleEnterSecuredComponent}
    getComponent=({nextState, cb) => {
       require.ensure([], () => {
           cb(null, require('YourComponent').default);
       });
    }}
/>
...
const handleEnterSecuredComponent = (nextState, replace) => {
    const {login: {success}} = store.getState();
    if (!success) {
       replace('/login');
    }
};
Run Code Online (Sandbox Code Playgroud)

因此,如果用户经过身份验证,您的登录页面应该在 redux {login: {success: true}} 中设置。如果经过身份验证的用户尝试访问 /secured,他将被重定向到 /login。

require.ensure不起到任何身份验证的作用。它只是 webpack 分割 js 文件块以进行延迟加载的入口点。

  • @lgpasquale:前端的Javascript根本不应该包含合理的代码......永远不要相信客户端!您实施的所有“真正”安全机制都应该仅在服务器端。其他一切都只是为了用户体验。 (3认同)
  • 我已经在做类似的事情(使用react-router),但这并不能阻止未经身份验证的用户加载合理的javascript代码(如果他愿意的话)。如果他通过 require.ensure 手动向 webpack 创建的 chunk 的 URL 提交 GET 请求,则不会有任何授权机制阻止他下载该 chunk。 (2认同)