Comment restreindre l'accès à des routes dans réagissent-routeur?
Personne ne sait comment restreindre l'accès à certains itinéraires dans réagissent-routeur? Je veux vérifier si l'utilisateur est connecté avant d'autoriser l'accès à un itinéraire particulier. Je pensais que ce serait simple, mais les docs ne sont pas clairement comment le faire.
Est-ce quelque chose que je devrait mettre en place où je définis mon <Route>
composants, ou devrais-je être la manutention à l'intérieur de mon composant gestionnaires?
<Route handler={App} path="/">
<NotFoundRoute handler={NotFound} name="not-found"/>
<DefaultRoute handler={Login} name="login"/>
<Route handler={Todos} name="todos"/> {/* I want this to be restricted */}
</Route>
- Si ils ne sont pas connectés, à une redirection vers le gestionnaire de connexion. Notez également que le client a accès à l'ensemble de la JS il charge, afin de ne pas stocker des informations sensibles en elle.
- Semerad vous disposez de tous github à propos de comment il a réalisé cette brièvement.
- Je n'ai pas, désolé. La réponse de miciek ci-dessous était ce dont j'avais besoin, mais gardez à l'esprit que c'était avant de réagir-routeur 1.0. Je connais un certain nombre de choses ont changé depuis la 1.0 a été publié, mais c'est essentiellement similaire.
- la réponse est ce que j'utilise maintenant, et il fonctionne très bien
Vous devez vous connecter pour publier un commentaire.
Mise À Jour (Août 16, 2019)
Dans réagissent-routeur v4 et à l'aide de Réagir Crochets cela ressemble un peu différent. Nous allons commencer avec votre
App.js
.Nous sommes à l'aide d'un
Auth
bibliothèque pour vérifier si l'utilisateur est authentifié. Remplacez-le par votre auth de la fonction de contrôle. Si oui, alors nous avons mis l'isAuthenticated
drapeau àtrue
. Nous le faisons lors de notre première Application des charges. Également digne de mention, vous voudrez peut-être ajouter un chargement de signer sur votre application, tandis que l'auth vérification est en cours d'exécution, vous n'avez pas flash la page de connexion à chaque fois que vous actualisez la page.Ensuite on passe le drapeau à nos routes. Nous avons créer deux types de routes
AuthenticatedRoute
etUnauthenticatedRoute
.La
AuthenticatedRoute.js
ressemble à ceci.Il vérifie si
isAuthenticated
est fixé àtrue
. Si c'est le cas, ça va rendre le composant souhaité. Si pas, alors il va rediriger vers la page de connexion.La
UnauthenticatedRoute.js
sur l'autre main qui ressemble à ça.Dans ce cas, si le
isAuthenticated
est fixé àfalse
, ça va rendre le composant souhaité. Et si elle est définie sur true, il va vous envoyer à la page d'accueil.Vous pouvez trouver des versions détaillées sur notre guide - https://serverless-stack.com/chapters/create-a-route-that-redirects.html.
Ancienne version
Accepté la réponse est correcte, mais Mixin sont considérés comme dangereux (https://facebook.github.io/react/blog/2016/07/13/mixins-considered-harmful.html) par le Réagissent de l'équipe.
Si quelqu'un vient à travers cette question et est à la recherche de la manière recommandée pour ce faire, je suggère à l'aide d'Ordre Supérieur Composants au lieu de Mixin.
Voici un exemple d'un HOC qui vais vérifier si l'utilisateur est connecté avant de continuer. Et si l'utilisateur n'est pas connecté, alors il va vous rediriger vers la page de connexion. Ce composant prend un accessoire appelé
isLoggedIn
, qui est essentiellement un indicateur que votre application peut stocker d'indiquer si l'utilisateur est connecté.Et à utiliser cette HOC, suffit de l'enrouler autour de vos itinéraires. Dans le cas de votre exemple, il serait:
Je couvre ce et de quelques autres sujets en détail, étape par étape tutoriel ici - https://serverless-stack.com/chapters/create-a-hoc-that-checks-auth.html
this.props.isLoggedIn
avectrue
de dérivation et de la connexion?<Route handler={}/>
est obsolète dans v1.0, vous devez utiliser<Route component={} />
.componentWillMount
allez bientôt obsolète. Lire le post de blog sur reactjs.org. Au lieu de cela, j'irais avec la réponse @jacob fourni.ComponentWillMount
, vous en êtes la cause d'un effet secondaire. Je pense que le meilleur endroit pour appeler à lacheckAuth()
est surComponentDidMount
. Pourtant, je pense que cette réponse est la meilleure solution présentée ici. Réagir docs/login?redirect=${redirect}
);Il est (maintenant?) un exemple de ce à Réagir Routeur 4 docs pour
Redirect
Si vous souhaitez utiliser l'authentification à travers l'ensemble de votre demande, vous avez besoin pour stocker des données de l'application (par exemple, un jeton). Vous pouvez configurer deux Réagissent mixin qui sont responsables de la gestion
$auth
objet. Cet objet ne doit pas être disponible en dehors de ces deux mixin. Voici à titre d'exemple:Alors vous pouvez simplement mixin
Authenticator
mélange à votre de connexion des composants (écran de connexion, de connexion de pop-up, etc) et d'appelerthis.login
fonction quand vous avez toutes les données nécessaires.La chose la plus importante est la protection de vos composants en mélangeant dans
NeedsAuthenticatedUser
mixin. Chaque composant qui a besoin authentifié, l'utilisateur doit ressembler à ça:Noter que
NeedsAuthenticatedUser
utilise réagir-routeur API (willTransitionTo
ettransition.abort()
).react-router
encourage une approche déclarative pour votre routeur, vous devriez faire de votre routeur aussi stupide que possible et éviter de mettre votre logique de routage de vos composants.Voici comment vous pouvez le faire (en supposant que vous transmettez à l'
loggedIn
prop):privé de l'itinéraire.tsx
Utilisation:
Basé sur https://tylermcginnis.com/react-router-protected-routes-authentication/.
Vous pouvez utiliser HOC et auth est une variable, vous pouvez changer la valeur true ou false signifie(autorisation)
généralement un utilisateur connecté sera accordé un jeton, et utilise cette marque pour toute communication avec le serveur. Ce que nous avons l'habitude de faire est de définir une page racine, et les choses se construire au-dessus de cette page. cette page racine ne de la localisation, de l'authentification et d'autres configurations pour vous.
voici un exemple
sur la racine de votre page, vérifier jeton de la valeur null ou d'authentifier le jeton avec le serveur pour voir si l'utilisateur est valide de connexion.
espère que cela aide 🙂