J'essayais d'implémenter des routes authentifiées mais j'ai trouvé que React Router 4 empêche maintenant que cela fonctionne:
<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>
L'erreur est:
Attention: vous ne devez pas utiliser
<Route component>
et<Route children>
dans le même itinéraire;<Route children>
sera ignoré
Dans ce cas, quelle est la bonne façon de mettre en œuvre cela?
Il apparaît dans la documentation react-router
(v4), il suggère quelque chose comme
<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>
Mais est-il possible d'y parvenir en regroupant plusieurs itinéraires?
METTRE À JOUR
Ok, après quelques recherches, je suis venu avec ceci:
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
}
Il est correct d'envoyer une action dans render()
ce sens. Cela ne semble pas vraiment correct avec componentDidMount
ou avec un autre crochet non plus?
javascript
reactjs
react-router
react-router-v4
Jiew Meng
la source
la source
componentWillMount
, pourra-t-il jamais voir la sortie rendue même pendant une fraction de seconde?componentWillMount()
n'est pas appelé sur SSR, c'estcomponentDidMount()
que ce n'est pas appelé. commecomponentWillMount()
on l'a appelé auparavantrender()
, de sorte que l'utilisateur ne verra rien de nouveau composant. c'est donc le meilleur endroit pour vérifier.<Redirect to="/auth">
documentation au lieu d'appeler l'action de répartitionRéponses:
Vous allez vouloir utiliser le
Redirect
composant. Il existe plusieurs approches différentes de ce problème. En voici un que j'aime, avoir un composant PrivateRoute qui prend dans unauthed
accessoire, puis rend basé sur ces accessoires.Maintenant, tes
Route
s peuvent ressembler à quelque chose comme çaSi vous êtes toujours confus, j'ai écrit ce post qui peut vous aider - Routes protégées et authentification avec React Router v4
la source
<Redirect />
. Le problème est<Redirect />
ne semble pas fonctionner avec redux dans mon cas? J'ai besoin d'envoyer une actionstate: {from: props.location}}}
causé unmaximum call stack exceeded
. J'ai dû l'enlever. Pouvez-vous expliquer pourquoi cette option est utile @Tyler McGinnis?({component: Component, ...rest})
syntaxe. J'ai eu la même question lol! stackoverflow.com/a/43484565/6502003Tnx Tyler McGinnis pour la solution. Je fais mon idée à partir de l'idée de Tyler McGinnis.
Vous pouvez mettre en œuvre cela comme ça
decisionFunc juste une fonction qui retourne vrai ou faux
la source
(Utilisation de Redux pour la gestion de l'état)
Si l'utilisateur essaie d'accéder à une URL, je vais d'abord vérifier si le jeton d'accès est disponible, sinon rediriger vers la page de connexion.Une fois que l'utilisateur se connecte à l'aide de la page de connexion, nous le stockons dans le stockage local ainsi que dans notre état redux. (stockage local ou cookies .. nous gardons ce sujet hors de son contexte pour l'instant).
depuis l'état de redux comme mis à jour et les routes privées seront rendues. maintenant nous avons un jeton d'accès donc nous allons rediriger vers la page d'accueil.
Stockez également les données de charge utile d'autorisation décodées dans l'état redux et transmettez-les au contexte de réaction. (Nous n'avons pas besoin d'utiliser le contexte, mais pour accéder à l'autorisation dans l'un de nos composants enfants imbriqués, il est facile d'accéder à partir du contexte au lieu de connecter chaque composant enfant à redux).
Toutes les routes qui n'ont pas besoin de rôles spéciaux peuvent être accédées directement après la connexion .. Si elle a besoin d'un rôle comme admin (nous avons fait une route protégée qui vérifie s'il avait le rôle souhaité sinon redirige vers un composant non autorisé)
de même dans l'un de vos composants si vous devez désactiver le bouton ou quelque chose en fonction du rôle.
tu peux simplement faire de cette manière
Alors que faire si l'utilisateur essaie d'insérer un jeton factice dans localstorage. Comme nous avons un jeton d'accès, nous redirigerons vers le composant d'accueil. Mon composant domestique effectuera un appel au repos pour récupérer des données, puisque le jeton jwt était factice, l'appel au repos retournera un utilisateur non autorisé. Donc, j'appelle la déconnexion (ce qui effacera le stockage local et redirigera à nouveau vers la page de connexion). Si la page d'accueil contient des données statiques et ne fait aucun appel d'API (alors vous devriez avoir un appel API de vérification de jeton dans le backend afin de pouvoir vérifier si le jeton est RÉEL avant de charger la page d'accueil)
index.js
History.js
Privateroutes.js
checkAuth.js
ÉCHANTILLON DE JWT DÉCODÉ
la source
Signin
? Si un utilisateur sait qu'il n'est pas connecté, il devrait avoir la possibilité d'accéder directement à la connexion, n'est-ce pas?installer react-router-dom
puis créez deux composants, l'un pour les utilisateurs valides et l'autre pour les utilisateurs non valides.
essayez ceci sur app.js
la source
Basé sur la réponse de @Tyler McGinnis . J'ai fait une approche différente en utilisant la syntaxe ES6 et des routes imbriquées avec des composants enveloppés:
Et en l'utilisant:
la source
Je sais que cela fait un moment, mais je travaille sur un package npm pour les routes privées et publiques.
Voici comment créer un itinéraire privé:
Et vous pouvez également créer des routes publiques auxquelles seul un utilisateur non autorisé peut accéder
J'espère que ça aide!
la source
J'ai implémenté en utilisant
Les accessoires d'authentification seront transmis aux composants, par exemple l'inscription en utilisant quel état d'utilisateur peut être modifié. AppRoutes complet
Consultez le projet complet ici: https://github.com/varunon9/hello-react
la source
Il semble que votre hésitation soit à créer votre propre composant, puis à distribuer la méthode de rendu? Eh bien, vous pouvez éviter les deux en utilisant simplement la
render
méthode du<Route>
composant. Pas besoin de créer un<AuthenticatedRoute>
composant sauf si vous le souhaitez vraiment. Cela peut être aussi simple que ci-dessous. Notez la{...routeProps}
diffusion en vous assurant de continuer à envoyer les propriétés du<Route>
composant vers le composant enfant (<MyComponent>
dans ce cas).Voir la documentation de rendu du React Router V4
Si vous souhaitez créer un composant dédié, il semble que vous soyez sur la bonne voie. Étant donné que React Router V4 est un routage purement déclaratif (il le dit directement dans la description), je ne pense pas que vous vous en sortiriez en mettant votre code de redirection en dehors du cycle de vie normal des composants. En regardant le code pour React Router lui - même , ils exécutent la redirection soit
componentWillMount
oucomponentDidMount
selon qu'il s'agit ou non d'un rendu côté serveur. Voici le code ci-dessous, qui est assez simple et pourrait vous aider à vous sentir plus à l'aise avec l'emplacement de votre logique de redirection.la source
Ma réponse précédente n'est pas évolutive. Voici ce que je pense être une bonne approche-
Vos itinéraires-
L'idée est d'utiliser un wrapper dans les
component
accessoires qui renverrait le composant d'origine si aucune authentification n'est requise ou déjà authentifié sinon retournerait le composant par défaut, par exemple Login.la source
Voici l'itinéraire protégé simple et propre
isTokenVerified
est un appel de méthode pour vérifier le jeton d'autorisation, il renvoie essentiellement un booléen.la source
Voici comment je l'ai résolu avec React et Typescript. J'espère que ça aide !
la source
la source
Je cherchais également une réponse. Ici, toutes les réponses sont assez bonnes, mais aucune d'entre elles ne donne de réponses sur la façon dont nous pouvons l'utiliser si l'utilisateur lance l'application après l'avoir rouverte. (Je voulais dire en utilisant des cookies ensemble).
Pas besoin de créer même un composant privateRoute différent. Ci-dessous mon code
Et voici authComponent
Ci-dessous, j'ai écrit un blog, vous pouvez également obtenir des explications plus approfondies.
Créer des routes protégées dans ReactJS
la source
La solution qui a finalement fonctionné le mieux pour mon organisation est détaillée ci-dessous, elle ajoute simplement une vérification du rendu pour la route sysadmin et redirige l'utilisateur vers un chemin principal différent de l'application s'il n'est pas autorisé à être dans la page.
SysAdminRoute.tsx
Il existe 3 routes principales pour notre implémentation, le / site public, le client / application connecté et les outils d'administration système à / sysadmin. Vous êtes redirigé en fonction de votre «authenticité» et voici la page / sysadmin.
SysAdminNav.tsx
la source