Я использую в своем проекте реактивный маршрутизатор. Я пытаюсь защитить страницы аутентифицированного пользователя от неаутентифицированных пользователей.
Мой код как ниже
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;





Не могли бы вы попробовать это?
<Switch>
<Route exact path = "/" component = {Login} />
<Route exact path = "/register" component = {Register} />
{
!Auth.isAuthenticated() && <Redirect to = "/" />
}
<Route exact path = "/dashboard" component = {Dashboard} />
</Switch>
Есть несколько способов сделать это, но недавно я создал функцию-оболочку для расширения моих защищенных маршрутов.
то есть:
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 как отдельный компонент? Спасибо.
Что ты имеешь в виду? Поделись тем, что ты сделал
Поделитесь своим кодом в сообщении и в чем ошибка?
Хорошо, видел обновленный код, и это именно то, что я опубликовал. Но в чем ошибка? и как вы использовали это в своих маршрутах? показать все необходимое, чтобы я мог помочь
Спасибо. Я получаю черную страницу в компоненте Dashboard.
Что ж, это не очень помогает, так как я хочу знать, есть ли у вас ошибки консоли. Но вкратце. Созданный нами новый компонент перенаправляет пользователя на путь «/ login». Как я вижу в опубликованном вами коде, у вас нет пути "/ login". Компонент входа в систему отображается на "/", поэтому обновите "memberAreaHOC", чтобы перенаправить на этот путь "/"
Спасибо. Я изменил "/ логин" на "/". Но результат остался прежним.
Поделитесь своими ошибками! сделайте console.infos внутри различных компонентов, чтобы мы могли видеть, куда что-то попадает или не попадает
Оберните 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? Ваше решение выглядит сложным.
Как правило, HOC создается для повторного использования функциональности. Таким образом, чтобы аутентифицировать пользователя для каждого маршрута и для всех его аутентифицированных обновлений или создания, это необходимо. Поскольку componentWillMount будет проверять его аутентификацию перед рендерингом обернутого компонента, тогда как componentWillUpdate будет проверять для аутентификации перед обновлением чего-либо в потоке аутентифицированного пользователя. Это очень просто.
Спасибо @Abinthaha. Если я воспользуюсь вашим решением, я не смогу войти в систему. Я остаюсь на странице входа в систему. Спасибо.