Я пытался реализовать аутентифицированные маршруты, но обнаружил, что React Router 4 теперь мешает этому работать:
<Route exact path="/" component={Index} />
<Route path="/auth" component={UnauthenticatedWrapper}>
<Route path="/auth/login" component={LoginBotBot} />
</Route>
<Route path="/domains" component={AuthenticatedWrapper}>
<Route exact path="/domains" component={DomainsIndex} />
</Route>
Ошибка:
Предупреждение: вы не должны использовать
<Route component>
и<Route children>
по одному и тому же маршруту;<Route children>
будут проигнорированы
В таком случае, как правильно это реализовать?
Он появляется в документации react-router
(v4), он предлагает что-то вроде
<Router>
<div>
<AuthButton/>
<ul>
<li><Link to="/public">Public Page</Link></li>
<li><Link to="/protected">Protected Page</Link></li>
</ul>
<Route path="/public" component={Public}/>
<Route path="/login" component={Login}/>
<PrivateRoute path="/protected" component={Protected}/>
</div>
</Router>
Но можно ли добиться этого, сгруппировав несколько маршрутов вместе?
ОБНОВИТЬ
Хорошо, после некоторых исследований я пришел к следующему:
import React, {PropTypes} from "react"
import {Route} from "react-router-dom"
export default class AuthenticatedRoute extends React.Component {
render() {
if (!this.props.isLoggedIn) {
this.props.redirectToLogin()
return null
}
return <Route {...this.props} />
}
}
AuthenticatedRoute.propTypes = {
isLoggedIn: PropTypes.bool.isRequired,
component: PropTypes.element,
redirectToLogin: PropTypes.func.isRequired
}
Правильно отправлять действие - render()
это неправильно. Это действительно не кажется правильным componentDidMount
или какой-то другой крючок?
javascript
reactjs
react-router
react-router-v4
Jiew Meng
источник
источник
componentWillMount
, смогут ли они когда-нибудь увидеть визуализированный результат даже на долю секунды?componentWillMount()
SSR не вызывается, этоcomponentDidMount()
то, что не вызывается. какcomponentWillMount()
вызывается ранееrender()
, поэтому пользователь не увидит ничего нового. так что это лучшее место для проверки.<Redirect to="/auth">
из документации вместо вызова действия отправкиОтветы:
Вы захотите использовать
Redirect
компонент. Есть несколько разных подходов к этой проблеме. Вот один, который мне нравится, у него есть компонент PrivateRoute, который принимаетauthed
опору, а затем рендерит на ее основе.Теперь ваш
Route
s может выглядеть примерно такЕсли вы все еще в затруднении, я написал этот пост, который может помочь - Защищенные маршруты и аутентификация с помощью React Router v4
источник
<Redirect />
. Проблема в том,<Redirect />
что в моем случае не работает с redux? «Мне нужно отправить действие»state: {from: props.location}}}
вызвалоmaximum call stack exceeded
. Пришлось удалить. Не могли бы вы объяснить, почему эта опция полезна, @Tyler McGinnis?({component: Component, ...rest})
синтаксис. У меня был такой же вопрос, лол! stackoverflow.com/a/43484565/6502003Спасибо Тайлеру МакГиннису за решение. Я основываю свою идею на идее Тайлера МакГинниса.
Вы можете реализовать это так
solutionFunc просто функция, возвращающая истину или ложь
источник
(Использование Redux для управления состоянием)
Если пользователь пытается получить доступ к любому URL-адресу, сначала я собираюсь проверить, доступен ли токен доступа, если не перенаправить на страницу входа. Как только пользователь входит в систему с помощью страницы входа, мы сохраняем его в localstorage, а также в нашем состоянии redux. (локальное хранилище или файлы cookie ... пока мы не используем эту тему вне контекста).
так как состояние redux обновлено, а частные маршруты будут перерисованы. теперь у нас есть токен доступа, поэтому мы перейдем на домашнюю страницу.
Сохраните декодированные данные полезной нагрузки авторизации также в состоянии redux и передайте их контексту реакции. (Нам не нужно использовать контекст, но для доступа к авторизации в любом из наших вложенных дочерних компонентов он упрощает доступ из контекста вместо подключения каждого дочернего компонента к redux) ..
Все маршруты, для которых не требуются специальные роли, могут быть доступны сразу после входа в систему. Если ему нужна роль, такая как admin (мы создали защищенный маршрут, который проверяет, была ли у него желаемая роль, если не перенаправляет на неавторизованный компонент)
аналогично в любом вашем компоненте, если вам нужно отключить кнопку или что-то еще в зависимости от роли.
просто вы можете сделать таким образом
Так что, если пользователь попытается вставить фиктивный токен в локальное хранилище. Поскольку у нас есть токен доступа, мы перенаправим его на домашний компонент. Мой домашний компонент выполнит вызов rest для захвата данных, поскольку токен jwt был фиктивным, вызов rest вернет неавторизованного пользователя. Поэтому я вызываю выход из системы (который очистит локальное хранилище и снова перенаправит на страницу входа). Если на домашней странице есть статические данные и не выполняется никаких вызовов api (тогда у вас должен быть вызов api для проверки токена в бэкэнде, чтобы вы могли проверить, является ли токен REAL перед загрузкой домашней страницы)
index.js
History.js
Privateroutes.js
checkAuth.js
ДЕКОДИРОВАННЫЙ ОБРАЗЕЦ ТОКЕНА JWT
источник
Signin
? Если пользователь знает, что он не вошел в систему, у него должна быть возможность получить прямой доступ к входу, верно?установить response-router-dom
затем создайте два компонента: один для допустимых пользователей, а другой - для недействительных.
попробуйте это на app.js
источник
На основе ответа @Tyler McGinnis . Я применил другой подход, используя синтаксис ES6 и вложенные маршруты с обернутыми компонентами:
И используя это:
источник
Я знаю, что это было давно, но я работал над пакетом npm для частных и общедоступных маршрутов.
Вот как составить частный маршрут:
И вы также можете сделать общедоступные маршруты, к которым может получить доступ только неавторизованный пользователь.
Я надеюсь, что это помогает!
источник
Я реализовал с помощью -
Параметры аутентификации будут переданы компонентам, например, при регистрации, с помощью которой можно изменить состояние пользователя. Завершить AppRoutes-
Проверьте полный проект здесь: https://github.com/varunon9/hello-react
источник
Кажется, вы сомневаетесь в том, чтобы создать свой собственный компонент, а затем отправить его в методе рендеринга? Что ж, вы можете избежать обоих, просто используя
render
метод<Route>
компонента. Нет необходимости создавать<AuthenticatedRoute>
компонент, если вы этого не хотите. Это может быть так просто, как показано ниже. Обратите внимание на{...routeProps}
распространение, убедившись, что вы продолжаете передавать свойства<Route>
компонента дочернему компоненту (<MyComponent>
в данном случае).См. Документацию по рендерингу React Router V4.
Если вы действительно хотели создать специальный компонент, то, похоже, вы на правильном пути. Поскольку React Router V4 - это чисто декларативная маршрутизация (об этом сказано прямо в описании), я не думаю, что вам удастся поместить код перенаправления за пределы обычного жизненного цикла компонента. Глядя на коде для React самого маршрутизатор , они выполняют переадресацию в любом
componentWillMount
или вcomponentDidMount
зависимости от того, является ли он рендерингом на стороне сервера. Вот код ниже, который довольно прост и может помочь вам чувствовать себя более комфортно с тем, где разместить логику перенаправления.источник
Мой предыдущий ответ не масштабируется. Вот что я считаю хорошим подходом -
Ваши маршруты-
Идея состоит в том, чтобы использовать оболочку в
component
реквизитах, которая будет возвращать исходный компонент, если аутентификация не требуется или уже аутентифицирована, в противном случае будет возвращен компонент по умолчанию, например, Login.источник
Вот простой чистый защищенный маршрут
isTokenVerified
- это вызов метода для проверки токена авторизации, в основном он возвращает логическое значение.источник
Вот как я решил это с помощью React и Typescript. Надеюсь, поможет !
источник
источник
Я тоже искал ответ. Здесь все ответы довольно хороши, но ни один из них не дает ответов, как мы можем его использовать, если пользователь запускает приложение после его открытия. (Я имел в виду совместное использование файлов cookie).
Не нужно создавать даже разные компоненты privateRoute. Ниже мой код
А вот authComponent
Ниже я написал блог, там вы также можете получить более подробное объяснение.
Создавайте защищенные маршруты в ReactJS
источник
Решение, которое в конечном итоге сработало лучше всего для моей организации, подробно описано ниже, оно просто добавляет проверку рендеринга для маршрута системного администратора и перенаправляет пользователя на другой основной путь приложения, если им не разрешено находиться на странице.
SysAdminRoute.tsx
Есть 3 основных пути для нашей реализации: общедоступный / сайт, авторизованный клиент / приложение и инструменты системного администратора в / sysadmin. Вы будете перенаправлены на основе вашей «аутентичности», и это страница в / sysadmin.
SysAdminNav.tsx
источник