【问题标题】:Prevent an user from accessing other routes - ReactJS - React-Router -阻止用户访问其他路由 - ReactJS - React-Router -
【发布时间】:2017-10-08 09:57:57
【问题描述】:

我有两个环境:“管理员”和“校友”。我想知道如何做到这一点,以使“管理员”用户无法访问“校友”用户的路线,反之亦然。我正在使用 React-Router 2.4.0。用这项技术可以做到吗?我是 ReactJS 的新手(我使用的是 15.4.2 版)。

另一个问题:更新到新版本并转译我所有的路线是否方便?

这是我的路线:

        <Router history={browserHistory}>
            <Route path="/" component={NotFound}/>
            <Redirect from="/alumno" to="/alumno/inicio"/>
            <Redirect from="/administrador" to="/administrador/inicio"/>

            <Route path="/" component={App}>

                <Route path="alumno" component={AppAlumno}>
                    <Route path="inicio" component={Alumno_Inicio}/>
                    <Route path="nueva_incidencia" component={Alumno_NuevaIncidencia}/>
                    <Route path="mis_incidencias" component={Alumno_MisIncidencias}/>
                </Route>

                <Route path="administrador" component={AppAdministrador}>
                    <Route path="inicio" component={Administrador_Inicio}/>
                    <Route path="nueva_incidencia" component={Administrador_NuevaIncidencia}/>
                    <Route path="incidencias_recibidas" component={Administrador_IncidenciasRecibidas}/>
                    <Route path="incidencias_recibidas/nuevo_informe" component={Administrador_NuevoInforme}/>
                    <Route path="informes" component={Administrador_Informes}/>
                    <Route path="informes/nueva_respuesta_informe" component={Administrador_NuevaRespuestaInforme}/>
                </Route>
            </Route>
        </Router>

谢谢。

【问题讨论】:

    标签: reactjs ecmascript-6 react-router


    【解决方案1】:

    所以回答你的问题:

    第一个问题:

    是的,使用此技术可以限制对路线的访问。有几种方法可以做到这一点,最简单的方法是在componentWillMount() 函数中检查用户的身份。它可能看起来像这样,具体取决于您如何将您的用户识别为管理员或校友:

    import React from 'react';
    import { browserHistory } from 'react-router';
    
    class YourComponent extends React.Component{
    
      componentWillMount(){
        //If user is an Alumno, throw them to '/some/path'
        if(this.state.isAlumno)
          browserHistory.push('/some/path');
      }
    
      render(){
        return <YourJsx />;
      }
    }
    
    export default YourComponent;
    

    这样你就不需要改变你的路线了。

    您还可以通过使用返回要限制访问的组件的高阶组件 (HOC) 来实现相同的功能。如果你想走 HOC 的方式,你首先需要创建一个新的组件,看起来像这样:

    import React from 'react';
    import {browserHistory} from 'react-router';
    
    //This function receives the Component that only some user should access
    function RequireAdmin(ComposedComponent){
    
      class Authenticated extends React.Component {
    
        componentWillMount(){
          if(this.state.isAlumno)
            browserHistory.push('/some/path');
        }
    
        render(){
          return <ComposedComponent />;
        }
      }
      //Return the new Component that requires authorization
      return Authenticated;
    }
    

    然后,您要限制访问的路由将如下所示:

    <Route path="administrador" component={RequireAdmin(AppAdministrador)}>
      ...
    </Route>
    

    就个人而言,我更喜欢第二种方式。它使路由更清晰,哪些路由需要什么样的授权,并将组件与授权分开。


    回答第二个问题:

    这取决于它会有多少麻烦。我当然会推荐学习新的 API react-router v4,但我认为更新一个已经构建的项目是不值得的,特别是一个与你的路由一样多的项目。

    希望这会有所帮助! Buena suerte con 反应。

    【讨论】:

    • 非常感谢您的回答!我喜欢那个:'Buena suerte con React'(我是西班牙人):D。但我不明白一些东西......我必须把它放在'/ some / path' 中吗?在return () {} ?。我在上面放置的路径是一个名为 IndexRoutes.jsx 的 .jsx(它本身就是一个组件)。如果它是来自 AJAX 查询的“校友”或“管理员”,我将收集信息。然后我将其保存在“用户类型”状态(可以是“学生”或“管理员”)。完成后...如何限制不适合的路线?
    • 同意!我会记住这一点,我将在我的下一个项目中部署新版本的 React-Router。如果是菜鸟问题,我很抱歉,但正如我在问题中所说,我是这项技术的新手。再次感谢您提供的帮助。
    • 可能是主页,而不是'some/path',或者当有人想要访问他们不应该访问的路线时,您想要重定向的地方。例如,如果 Alumno 尝试访问管理员路由,则重定向到 'alumno/inicio。第一个返回应该是你在组件中已经拥有的任何东西,它不会改变。在第二个示例中,您应该在 return 语句中包含作为函数 RequireAdmin() 的参数收到的组件,这有帮助吗?
    • 嘿,我们都是菜鸟哈哈。无需道歉。
    • 您好!我还有一个问题,如果我的 NavBar 上有一个状态:isAdmin(NavBar 是其他组件);我怎么能从其他组件(HOC)读取这个状态?这样,我将避免在每次路由更改时执行 AJAX,除了在我的 NavBar 组件中我已经保存了该数据。还有一个问题.. 在您的示例中,this.state.isAdmin 存储在哪里?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 2021-04-08
    相关资源
    最近更新 更多