Estaba tratando de implementar rutas autenticadas, pero descubrí que React Router 4 ahora evita que esto funcione:
<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>
El error es:
Advertencia: No debe utilizar
<Route component>
y<Route children>
en la misma ruta;<Route children>
será ignorado
En ese caso, ¿cuál es la forma correcta de implementar esto?
Aparece en react-router
documentos (v4), sugiere algo como
<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>
Pero, ¿es posible lograr esto agrupando un montón de rutas?
ACTUALIZAR
Ok, después de investigar un poco, se me ocurrió esto:
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
}
Es correcto enviar una acción en render()
él se siente mal. ¿Realmente no parece correcto con componentDidMount
o con algún otro gancho tampoco?
javascript
reactjs
react-router
react-router-v4
Jiew Meng
fuente
fuente
componentWillMount
, ¿alguna vez podrá ver la salida renderizada incluso por una fracción de segundo?componentWillMount()
no se llama en SSR, escomponentDidMount()
que no se llama. comocomponentWillMount()
se llamó antesrender()
, por lo que el usuario no verá nada del componente nuevo. por lo que es el mejor lugar para buscar.<Redirect to="/auth">
de los documentos en lugar de llamar a la acción de envíoRespuestas:
Vas a querer usar el
Redirect
componente. Hay algunos enfoques diferentes para este problema. Aquí hay uno que me gusta, tiene un componente PrivateRoute que toma unauthed
accesorio y luego se renderiza en función de ese accesorio.Ahora tu
Route
s puede verse algo como estoSi todavía está confundido, escribí esta publicación que puede ayudar: rutas protegidas y autenticación con React Router v4
fuente
<Redirect />
. ¿El problema es<Redirect />
que no parece funcionar con redux en mi caso? Necesito enviar una acciónstate: {from: props.location}}}
causó unmaximum call stack exceeded
. Tuve que quitarlo. ¿Podrías explicar por qué esta opción es útil @Tyler McGinnis?({component: Component, ...rest})
sintaxis. ¡Tenía la misma pregunta lol! stackoverflow.com/a/43484565/6502003Tnx Tyler McGinnis por una solución. Hago mi idea a partir de la idea de Tyler McGinnis.
Puedes implementar eso así
decisionFunc solo una función que devuelve verdadero o falso
fuente
(Usando Redux para la gestión del estado)
Si el usuario intenta acceder a cualquier URL, primero voy a verificar si el token de acceso está disponible, si no lo redirigir a la página de inicio de sesión, una vez que el usuario inicia sesión usando la página de inicio de sesión, lo almacenamos en el almacenamiento local así como en nuestro estado redux. (almacenamiento local o cookies ... mantenemos este tema fuera de contexto por ahora).
ya que el estado de redux como actualizado y las rutas privadas se volverán a generar. ahora tenemos token de acceso, así que lo redireccionaremos a la página de inicio.
Almacene los datos de carga útil de autorización decodificados también en estado redux y páselos al contexto de reacción. (No tenemos que usar el contexto, pero para acceder a la autorización en cualquiera de nuestros componentes secundarios anidados, es fácil acceder desde el contexto en lugar de conectar todos y cada uno de los componentes secundarios a redux).
Se puede acceder a todas las rutas que no necesitan roles especiales directamente después de iniciar sesión. Si necesita un rol como administrador (hicimos una ruta protegida que verifica si tenía el rol deseado o si no se redirige a un componente no autorizado)
de manera similar en cualquiera de sus componentes si tiene que deshabilitar el botón o algo basado en el rol.
simplemente puedes hacerlo de esta manera
Entonces, ¿qué pasa si el usuario intenta insertar un token ficticio en localstorage? Como tenemos token de acceso, lo redireccionaremos al componente de inicio. Mi componente de inicio hará una llamada de descanso para obtener datos, ya que el token jwt era ficticio, la llamada de descanso devolverá al usuario no autorizado. Así que llamo al cierre de sesión (que borrará el almacenamiento local y redirigirá a la página de inicio de sesión nuevamente). Si la página de inicio tiene datos estáticos y no realiza ninguna llamada de API (entonces debe tener una llamada de API de verificación de token en el backend para que pueda verificar si el token es REAL antes de cargar la página de inicio)
index.js
History.js
Privateroutes.js
checkAuth.js
MUESTRA DE TOKEN JWT DECODIFICADO
fuente
Signin
? Si un usuario sabe que no ha iniciado sesión, debería tener la opción de acceder directamente al inicio de sesión, ¿verdad?instalar react-router-dom
luego cree dos componentes, uno para usuarios válidos y otro para usuarios inválidos.
prueba esto en app.js
fuente
Basado en la respuesta de @Tyler McGinnis . Hice un enfoque diferente usando la sintaxis de ES6 y rutas anidadas con componentes envueltos:
Y usándolo:
fuente
Sé que ha pasado un tiempo, pero he estado trabajando en un paquete npm para rutas públicas y privadas.
Aquí se explica cómo hacer una ruta privada:
Y también puede hacer rutas públicas a las que solo pueden acceder los usuarios no autorizados
¡Espero que ayude!
fuente
Implementé usando-
Los accesorios de autenticación se pasarán a los componentes, por ejemplo, el registro con el que se puede cambiar el estado del usuario. AppRoutes completas
Consulta el proyecto completo aquí: https://github.com/varunon9/hello-react
fuente
¿Parece que su duda es crear su propio componente y luego enviarlo en el método de renderizado? Bueno, puedes evitar ambos con solo usar el
render
método del<Route>
componente. No es necesario crear un<AuthenticatedRoute>
componente a menos que realmente lo desee. Puede ser tan simple como a continuación. Tenga en cuenta la{...routeProps}
extensión asegurándose de continuar enviando las propiedades del<Route>
componente al componente secundario (<MyComponent>
en este caso).Consulte la documentación de renderización de React Router V4
Si desea crear un componente dedicado, parece que está en el camino correcto. Dado que React Router V4 es un enrutamiento puramente declarativo (lo dice bien en la descripción), no creo que se salga con la suya poniendo su código de redireccionamiento fuera del ciclo de vida normal del componente. Mirando el código para React Router en sí , realizan la redirección en cualquiera de los dos
componentWillMount
ocomponentDidMount
dependiendo de si se trata de una representación del lado del servidor. Aquí está el código a continuación, que es bastante simple y puede ayudarlo a sentirse más cómodo con dónde colocar su lógica de redirección.fuente
Mi respuesta anterior no es escalable. Esto es lo que creo que es un buen enfoque:
Tus rutas
La idea es usar un contenedor en los
component
accesorios que devolvería el componente original si no se requiere autenticación o si ya está autenticado, de lo contrario, devolvería el componente predeterminado, por ejemplo, Iniciar sesión.fuente
Aquí está la ruta protegida limpia simple
isTokenVerified
es una llamada a un método para verificar el token de autorización, básicamente, devuelve un valor booleano.fuente
Así es como lo resolví con React y Typecript. Espero eso ayude !
fuente
fuente
También estaba buscando alguna respuesta. Aquí todas las respuestas son bastante buenas, pero ninguna de ellas da respuestas sobre cómo podemos usarla si el usuario inicia la aplicación después de abrirla. (Quise decir usar cookies juntos).
No es necesario crear ni siquiera un componente privateRoute diferente. Abajo está mi código
Y aquí está authComponent
A continuación, escribí un blog, también puede obtener una explicación más detallada allí.
Crear rutas protegidas en ReactJS
fuente
La solución que finalmente funcionó mejor para mi organización se detalla a continuación, solo agrega una verificación en el renderizado para la ruta del administrador del sistema y redirige al usuario a una ruta principal diferente de la aplicación si no se les permite estar en la página.
SysAdminRoute.tsx
Hay 3 rutas principales para nuestra implementación, el público / sitio, el cliente / aplicación que ha iniciado sesión y las herramientas de administración del sistema en / sysadmin. Se le redirige en función de su 'autorización' y esta es la página en / sysadmin.
SysAdminNav.tsx
fuente