如何使用 react-router 处理身份验证?

ThunD3eR

尝试使某些路由需要身份验证。

我有这个:

class App extends Component {
  render() {
    const menuClass = `${this.props.contentMenuClass} col-xs-12 col-md-9`;
    return (  
      <BrowserRouter history={browserHistory}>
        <div className="App">
          <Header properties={this.props} />
            <div className="container-fluid">
              <div className="row">
                <SideNav />
                <div className={menuClass} id="mainContent">
                  <Switch>
                    {routes.map(prop =>
                        (
                          <Route
                            path={prop.path}
                            component={prop.component}
                            key={prop.id}
                            render={() => (
                              !AuthenticationService.IsAutheenticated() ? 
                                <Redirect to="/Login"/>
                               : 
                               <Route path={prop.path}
                               component={prop.component}
                               key={prop.id}/>

                            )}
                          />
                        ))}
                  </Switch>
                </div>
              </div>
            </div>
          {/* <Footer /> */}

        </div>

      </BrowserRouter>
    );
  }
}

const mapStateToProps = state => ({
  contentMenuClass: state.menu,
});

export default connect(mapStateToProps)(App);

注意:是的,身份验证服务可以正常工作。

对于我正在检查用户是否通过身份验证的每条路线,如果没有,那么我想将他们重定向到登录页面,如果是,那么它将以“/”的路线登陆第一页。

我得到的只是:

react-dom.development.js:14227 The above error occurred in the <Route> component:
    in Route (created by App)
    in Switch (created by App)
    in div (created by App)
    in div (created by App)
    in div (created by App)
    in div (created by App)
    in Router (created by BrowserRouter)
    in BrowserRouter (created by App)
    in App (created by Connect(App))
    in Connect(App)
    in Provider

我哪里做错了?

马特·卡洛塔

一个简单的解决方案是制作一个HOC包含所有受保护路由(高阶组件)。

根据您的应用程序的嵌套方式,您可能希望使用本地状态或redux状态。

工作示例:https : //codesandbox.io/s/5m2690nn6n(使用本地状态)

路线/ index.js

import React from "react";
import { BrowserRouter, Switch, Route } from "react-router-dom";
import Home from "../components/Home";
import Players from "../components/Players";
import Schedule from "../components/Schedule";
import RequireAuth from "../components/RequireAuth";

export default () => (
  <BrowserRouter>
    <RequireAuth>
      <Switch>
        <Route exact path="/" component={Home} />
        <Route exact path="/players" component={Players} />
        <Route path="/schedule" component={Schedule} />
      </Switch>
    </RequireAuth>
  </BrowserRouter>
);

组件/RequireAuth.js

import React, { Component, Fragment } from "react";
import { withRouter } from "react-router-dom";
import Login from "./Login";
import Header from "./Header";

class RequireAuth extends Component {
  state = { isAuthenticated: false };

  componentDidMount = () => {
    if (!this.state.isAuthenticated) {
      this.props.history.push("/");
    }
  };

  componentDidUpdate = (prevProps, prevState) => {
    if (
      this.props.location.pathname !== prevProps.location.pathname &&
      !this.state.isAuthenticated
    ) {
      this.props.history.push("/");
    }
  };

  isAuthed = () => this.setState({ isAuthenticated: true });

  unAuth = () => this.setState({ isAuthenticated: false });

  render = () =>
    !this.state.isAuthenticated ? (
      <Login isAuthed={this.isAuthed} />
    ) : (
      <Fragment>
        <Header unAuth={this.unAuth} />
        {this.props.children}
      </Fragment>
    );
}

export default withRouter(RequireAuth);

或者,您可以创建一个包含受保护路由的受保护组件,而不是包装路由。

工作示例:https : //codesandbox.io/s/yqo75n896x(使用redux而不是本地状态)。

路线/ index.js

import React from "react";
import { BrowserRouter, Route, Switch } from "react-router-dom";
import { createStore } from "redux";
import { Provider } from "react-redux";
import Home from "../components/Home";
import Header from "../containers/Header";
import Info from "../components/Info";
import Sponsors from "../components/Sponsors";
import Signin from "../containers/Signin";
import RequireAuth from "../containers/RequireAuth";
import rootReducer from "../reducers";

const store = createStore(rootReducer);

export default () => (
  <Provider store={store}>
    <BrowserRouter>
      <div>
        <Header />
        <Switch>
          <Route exact path="/" component={Home} />
          <Route path="/info" component={Info} />
          <Route path="/sponsors" component={Sponsors} />
          <Route path="/protected" component={RequireAuth} />
          <Route path="/signin" component={Signin} />
        </Switch>
      </div>
    </BrowserRouter>
  </Provider>
);

容器/RequireAuth.js

import React from "react";
import { Route, Redirect } from "react-router-dom";
import { connect } from "react-redux";
import ShowPlayerRoster from "../components/ShowPlayerRoster";
import ShowPlayerStats from "../components/ShowPlayerStats";
import Schedule from "../components/Schedule";

const RequireAuth = ({ match: { path }, isAuthenticated }) =>
  !isAuthenticated ? (
    <Redirect to="/signin" />
  ) : (
    <div>
      <Route exact path={`${path}/roster`} component={ShowPlayerRoster} />
      <Route path={`${path}/roster/:id`} component={ShowPlayerStats} />
      <Route path={`${path}/schedule`} component={Schedule} />
    </div>
  );

export default connect(state => ({
  isAuthenticated: state.auth.isAuthenticated
}))(RequireAuth);

您甚至可以通过创建包装函数来获得更多模块化。您可以通过简单地包裹组件来挑选和选择任何路线。我没有代码框示例,但它与此设置类似

例如: <Route path="/blog" component={RequireAuth(Blog)} />

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用React-Router处理Firebase身份验证

来自分类Dev

使用React-Router和Firebase身份验证

来自分类Dev

使用 React-Router 在 ReactJS 中进行身份验证

来自分类Dev

react-router redux我如何在页面加载时更新状态以进行身份验证

来自分类Dev

使用React Router的服务器端身份验证流程

来自分类Dev

使用React-Router进行基于身份验证的重定向

来自分类Dev

使用React-Router进行基于身份验证的重定向

来自分类Dev

在 Meteor 中使用 react-router 3 到 4 重构身份验证

来自分类Dev

React Router-基于身份验证的重定向

来自分类Dev

如何使用React Router处理登录状态?

来自分类Dev

如何使用护照对React应用进行身份验证?

来自分类Dev

使用Riverpod处理身份验证

来自分类Dev

如何检查身份验证并使用ui-router自动重定向到登录状态?

来自分类Dev

如何检查身份验证并使用ui-router自动重定向到登录状态?

来自分类Dev

如何使用ServiceStack for SPA网站处理身份验证?

来自分类Dev

React-router 身份验证在路由更改时以 1 的增量重新触发

来自分类Dev

使用JWT的React-Redux身份验证

来自分类Dev

在React SPA中使用Django身份验证系统

来自分类Dev

使用React上下文的用户身份验证

来自分类Dev

使用React上下文的用户身份验证

来自分类Dev

在Service Worker中处理React App的身份验证

来自分类Dev

React Native FB SDK 处理身份验证拒绝

来自分类Dev

表单身份验证:如何处理未经授权的身份验证用户

来自分类Dev

从Cookie异步加载身份验证令牌时,React react-router-dom专用路由不起作用

来自分类Dev

MEAN js如何处理身份验证?

来自分类Dev

如何处理Firebase身份验证错误?/迅捷/ Firebase

来自分类Dev

如何处理多个身份验证提供程序(firebase)

来自分类Dev

openAM 如何处理身份验证请求?

来自分类Dev

显示加载屏幕时如何处理身份验证?

Related 相关文章

  1. 1

    使用React-Router处理Firebase身份验证

  2. 2

    使用React-Router和Firebase身份验证

  3. 3

    使用 React-Router 在 ReactJS 中进行身份验证

  4. 4

    react-router redux我如何在页面加载时更新状态以进行身份验证

  5. 5

    使用React Router的服务器端身份验证流程

  6. 6

    使用React-Router进行基于身份验证的重定向

  7. 7

    使用React-Router进行基于身份验证的重定向

  8. 8

    在 Meteor 中使用 react-router 3 到 4 重构身份验证

  9. 9

    React Router-基于身份验证的重定向

  10. 10

    如何使用React Router处理登录状态?

  11. 11

    如何使用护照对React应用进行身份验证?

  12. 12

    使用Riverpod处理身份验证

  13. 13

    如何检查身份验证并使用ui-router自动重定向到登录状态?

  14. 14

    如何检查身份验证并使用ui-router自动重定向到登录状态?

  15. 15

    如何使用ServiceStack for SPA网站处理身份验证?

  16. 16

    React-router 身份验证在路由更改时以 1 的增量重新触发

  17. 17

    使用JWT的React-Redux身份验证

  18. 18

    在React SPA中使用Django身份验证系统

  19. 19

    使用React上下文的用户身份验证

  20. 20

    使用React上下文的用户身份验证

  21. 21

    在Service Worker中处理React App的身份验证

  22. 22

    React Native FB SDK 处理身份验证拒绝

  23. 23

    表单身份验证:如何处理未经授权的身份验证用户

  24. 24

    从Cookie异步加载身份验证令牌时,React react-router-dom专用路由不起作用

  25. 25

    MEAN js如何处理身份验证?

  26. 26

    如何处理Firebase身份验证错误?/迅捷/ Firebase

  27. 27

    如何处理多个身份验证提供程序(firebase)

  28. 28

    openAM 如何处理身份验证请求?

  29. 29

    显示加载屏幕时如何处理身份验证?

热门标签

归档