Реагировать - Перенаправить пользователя не аутентифицирован - PullRequest
0 голосов
/ 26 октября 2019

Я использую Firestore и у меня есть доступ к состоянию, которое сообщит мне, аутентифицирован ли пользователь или нет. Я сопоставляю эти условия с реквизитами и буду использовать перенаправление react-router-dom для перехода пользователя на страницу входа в систему, если он не аутентифицирован.

Однако, когда я консоль регистрирую статус аутентификации, я вижу, что первоначально он будет показывать falseв то время как он загружает эту информацию, а затем переключается на истину. Однако к тому времени, когда он обнаруживает, что пользователи аутентифицированы, я уже перенаправил их.

Как мне перенаправить пользователей на основе их аутентификации в рамках реакции?

export class PrimaryNavBar extends Component {

  render(){
    const { auth, location } = this.props;
    const authenticated = auth.isLoaded && !auth.isEmpty;

    return (
      <React.Fragment>
      {!authenticated ? <Redirect to="/"/> : null}
      <Navbar bg="primary" variant="dark">
        <Container>
          <Link to="/">
    ....

У меня естьЗдесь были рассмотрены другие ответы, но они не помогли с перенаправлениями, просто выведите нулевые значения, если они не аутентифицированы.

Обновление

Я реструктурировал свой код для перенаправлений, произойдет в файле app.js

Новая проблема заключается в том, что всякий раз, когда я изменяю маршрут пользователем, он будет перепроверять аутентификацию, которая будетсначала ложь, и они снова окажутся на экране входа.

class App extends Component {
  state = {
    isAuthenticated: this.props.isAuthenticated
  }

  render() {
    const logoutHandler = () => {
      this.props.firebase.logout();
    };
    const authenticated = this.props.auth.isLoaded && !this.props.auth.isEmpty;
    return (
      <Aux>
        {!authenticated ? <Redirect to="/" /> : null}
        <Route path="/" exact component={Login} />
        <Route path='/(.+)' render={() => (
          <React.Fragment>
            <PrimaryNavBar logout={logoutHandler} />
            <Switch>
              <Route path="/dashboard" exact component={Dashboard} />
              <Route path="/auctions" component={Auctions} />
              <Route path="/auctions/:id" component={AuctionItem} />
              <Route path="/auctions/create-auction" component={CreateAuction} />
              <Route path="/bidders/create-bidder" component={CreateBidder} />
              <Route path="/bidders/:id" component={Bidder} />
              <Route path="/bidders" component={Bidders} />
            </Switch>
          </React.Fragment>
        )} />
        <ReduxToastr position="bottom-right" />
      </Aux>
    );
  }

}
const mapStateToProps = state => {
  return {
    isAuthenticated: state.firebase.auth.uid,
    auth: state.firebase.auth
  };
};

const mapDisptachToProps = dispatch => {
  return {};
};


export default withRouter(withFirebase(
  connect(
    mapStateToProps,
    mapDisptachToProps
  )(App)
));

1 Ответ

0 голосов
/ 26 октября 2019

Вам, вероятно, следует подождать, пока auth.isLoaded не станет правдой? Если это так, вы можете просто сделать

const { auth, location } = this.props;
if (!auth.isLoaded) return null

. Это предотвратит рендеринг вашего навигационного компонента, пока не будет загружена информация аутентификации. Возможно, вы захотите реализовать эту проверку (и перенаправление) на уровне родительского компонента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...