React Router для неаутентифицированного пользователя

Я использую в своем проекте реактивный маршрутизатор. Я пытаюсь защитить страницы аутентифицированного пользователя от неаутентифицированных пользователей.

Мой код как ниже

ReactDOM.render(
    <Router>
        <Switch>
            <Route exact path = "/" component = {Login} />
            <Route exact path = "/register" component = {Register} />

            if (Auth.isAuthenticated()) {                
                <Route exact path = "/dashboard" component = {Dashboard} />
            }
            else {
                <Redirect to = "/" />
            }
        </Switch>
    </Router>, 
    document.getElementById('root'));

Но этот <Redirect to = "/" /> не работает.

ОБНОВИТЬ

Я сделал еще один компонент, как показано ниже

Authentication.js

import React, { Component } from 'react';
import Auth from '../services/Auth';
import { Redirect} from "react-router-dom";

const memberAreaHOC = WrappedComponent => {
    class Authentication extends Component {
        render() {
            if ( ! Auth.isAuthenticated()) {
                return <Redirect to = "/login" />
            }
            return <WrappedComponent {...this.props}/>;
        }
    }
}

export default memberAreaHOC;
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
619
3

Ответы 3

Не могли бы вы попробовать это?

<Switch>
    <Route exact path = "/" component = {Login} />
    <Route exact path = "/register" component = {Register} />
    {
        !Auth.isAuthenticated() && <Redirect to = "/" />
    }
    <Route exact path = "/dashboard" component = {Dashboard} />
</Switch>

Спасибо @Abinthaha. Если я воспользуюсь вашим решением, я не смогу войти в систему. Я остаюсь на странице входа в систему. Спасибо.

abu abu 09.08.2018 11:37

Есть несколько способов сделать это, но недавно я создал функцию-оболочку для расширения моих защищенных маршрутов.

то есть:

const memberAreaHOC = WrappedComponent => {
  class MA extends Component {
    render() {
      if ( ! Auth.isAuthenticated()) {
        return <Redirect to = "/login" />
      }
      return <WrappedComponent {...this.props}/>;
    }
  }
}

а теперь в определении ваших маршрутов:

<Router>
    <Switch>
        <Route exact path = "/" component = {Login} />
        <Route exact path = "/register" component = {Register} />

        <Route exact path = "/dashboard" component = {memberAreaHOC(Dashboard)} />

    </Switch>
</Router>

Вы видите, я обернул Dashboard нашим новым memberAreaHOC

memberAreaHOC(Dashboard)

Спасибо, @Tzook Bar Noy. Я пытаюсь использовать ваше решение. Но я получаю ошибку. Я пытаюсь использовать const memberAreaHOC как отдельный компонент. Не могли бы вы отредактировать свой код, чтобы использовать const memberAreaHOC как отдельный компонент? Спасибо.

abu abu 09.08.2018 11:34

Что ты имеешь в виду? Поделись тем, что ты сделал

Tzook Bar Noy 09.08.2018 11:50

Поделитесь своим кодом в сообщении и в чем ошибка?

Tzook Bar Noy 09.08.2018 11:53

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

Tzook Bar Noy 09.08.2018 12:18

Спасибо. Я получаю черную страницу в компоненте Dashboard.

abu abu 09.08.2018 12:22

Что ж, это не очень помогает, так как я хочу знать, есть ли у вас ошибки консоли. Но вкратце. Созданный нами новый компонент перенаправляет пользователя на путь «/ login». Как я вижу в опубликованном вами коде, у вас нет пути "/ login". Компонент входа в систему отображается на "/", поэтому обновите "memberAreaHOC", чтобы перенаправить на этот путь "/"

Tzook Bar Noy 09.08.2018 12:31

Спасибо. Я изменил "/ логин" на "/". Но результат остался прежним.

abu abu 09.08.2018 12:40

Поделитесь своими ошибками! сделайте console.infos внутри различных компонентов, чтобы мы могли видеть, куда что-то попадает или не попадает

Tzook Bar Noy 09.08.2018 12:42

Оберните requireAuth в те компоненты, для доступа к которым требуется разрешение. Маршруты

<Route path = "/admindashboard" component = {requireAuth(App)}/>

Создайте компонент более высокого порядка для аутентификации пользователя. Как правило, HOC создается для повторного использования функциональных возможностей, где он принимает функцию в качестве входных данных и выдает выходные данные в качестве функции. Таким образом, чтобы аутентифицировать пользователя для каждого маршрута и для всех его аутентифицированных обновлений или Поскольку componentWillMount проверит свою аутентификацию перед рендерингом обернутого компонента, componentWillUpdate будет проверять аутентификацию перед обновлением чего-либо в потоке аутентифицированного пользователя.

import React from 'react';
import { connect } from 'react-redux';
import {withRouter} from 'react-router-dom';
import PropTypes from 'prop-types';

export default function(ComposedComponent) {
  class Authenticate extends React.Component {
    componentWillMount() {
      if (!this.props.isAuthenticated) {
         this.props.history.push('/');
      }
    }

    componentWillUpdate(nextProps) {
      if (!nextProps.isAuthenticated) {
        this.props.history.push('/');
      }
    }

    render() {
      return (
        <ComposedComponent {...this.props} />
      );
    }
  }

  Authenticate.propTypes = {
    isAuthenticated: PropTypes.bool.isRequired
  }

  function mapStateToProps(state) {
    return {
      isAuthenticated: state.auth.isAuthenticated
    };
  }

  return withRouter(connect(mapStateToProps, null)(Authenticate));
}

Зачем мне нужен HOC? Ваше решение выглядит сложным.

abu abu 09.08.2018 07:56

Как правило, HOC создается для повторного использования функциональности. Таким образом, чтобы аутентифицировать пользователя для каждого маршрута и для всех его аутентифицированных обновлений или создания, это необходимо. Поскольку componentWillMount будет проверять его аутентификацию перед рендерингом обернутого компонента, тогда как componentWillUpdate будет проверять для аутентификации перед обновлением чего-либо в потоке аутентифицированного пользователя. Это очень просто.

CodeZombie 09.08.2018 08:03

Другие вопросы по теме