redireccionar - Laravel redirige a su destino original después de iniciar sesión
redireccionar url laravel (17)
Esto parece un flujo bastante básico, y Laravel
tiene muchas buenas soluciones para cosas básicas, siento que me falta algo.
Un usuario hace clic en un enlace que requiere autenticación. El filtro de autenticación de Laravel entra en acción y los dirige a una página de inicio de sesión. El usuario inicia sesión y luego va a la página original a la que intentaba acceder antes de que se iniciara el filtro ''auth''.
¿Hay una buena manera de saber a qué página estaban tratando de llegar originalmente? Dado que Laravel es el que está interceptando la solicitud, no sabía si se realiza un seguimiento en algún lugar para un enrutamiento fácil después de que el usuario inicie sesión.
De lo contrario, me gustaría saber cómo algunos de ustedes lo han implementado de forma manual.
Laravel 3
Ajusté un poco tu código (Vinícius Fragoso Pinheiro) y coloqué lo siguiente en filters.php
Route::filter(''auth'', function()
{
// If there''s no user authenticated session
if (Auth::guest()) {
// Flash current url to session and redirect to login page
Session::flash(''redirect'', URL::full());
return Redirect::guest(''login'');
}
});
Y luego dentro de mi AuthController.php:
// Try to log the user in.
if (Auth::attempt($userdata)) {
if ($redirect = Session::get(''redirect'')) {
return Redirect::to($redirect);
} else {
// Redirect to homepage
return Redirect::to(''your_default_logged_in_page'')->with(''success'', ''You have logged in successfully'');
}
} else {
// Reflash the session data in case we are in the middle of a redirect
Session::reflash(''redirect'');
// Redirect to the login page.
return Redirect::to(''login'')->withErrors([''password'' => ''Password invalid''])->withInput(Input::except(''password''));
}
Tenga en cuenta que los datos de la sesión ''redirect''
se vuelven a sombrear si hay un problema de autenticación. Esto mantiene el redireccionamiento intacto durante cualquier error de inicio de sesión, pero si el usuario hace clic en cualquier punto, el siguiente proceso de inicio de sesión no se ve afectado por los datos de la sesión.
También debe volver a actualizar los datos en el momento de mostrar el formulario de inicio de sesión en su AuthController
, de lo contrario, la cadena está rota:
public function showLogin()
{
// Reflash the session data in case we are in the middle of a redirect
Session::reflash(''redirect'');
// Show the login page
return View::make(''auth/login'');
}
Laravel 5.2
Si está utilizando otro middleware como el middleware de administración , puede configurar una sesión para url.intended mediante el uso de lo siguiente:
Básicamente, necesitamos establecer manualmente /Session::put(''url.intended'', /URL::full());
para redirigir
Ejemplo
if (/Auth::guard($guard)->guest()) {
if ($request->ajax() || $request->wantsJson()) {
return response(''Unauthorized.'', 401);
} else {
/Session::put(''url.intended'', /URL::full());
return redirect(''login'');
}
}
Al iniciar sesión
Asegúrese de que en el intento de inicio de sesión use return /Redirect::intended(''default_path'');
Laravel> = 5.3
Los cambios de Auth en 5.3 hacen que la implementación de este sea un poco más fácil, y ligeramente diferente de 5.2 ya que el Auth Middleware se ha movido al contenedor de servicio.
Modificar el nuevo redirector de autenticación de Middleware
/app/Http/Middleware/RedirectIfAuthenticated.php
Cambia ligeramente la función de manejo, por lo que se ve así:
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect()->intended(''/home'');
}
return $next($request);
}
Explicación TL; DR
La única diferencia está en la 4ª línea; por defecto se ve así:
return redirect("/home");
Dado que Laravel> = 5.3 guarda automáticamente la última ruta "intencionada" cuando revisa el Auth Guard, cambia a:
return redirect()->intended(''/home'');
Eso le dice a Laravel que redirija a la última página prevista antes de iniciar sesión, de lo contrario, vaya a "/ home" o donde quiera enviarlos de manera predeterminada.
Espero que esto ayude a otra persona: no hay mucho por ahí sobre las diferencias entre 5.2 y 5.3, y en esta área en particular hay bastantes.
Para Laravel 5.3 y superior
Verifique la respuesta de Scott a continuación.
Para Laravel 5 hasta 5.2
Simplemente pon,
En middleware de autenticación:
// redirect the user to "/login"
// and stores the url being accessed on session
if (Auth::guest()) {
return redirect()->guest(''login'');
}
return $next($request);
En la acción de inicio de sesión:
// redirect the user back to the intended page
// or defaultpage if there isn''t one
if (Auth::attempt([''email'' => $email, ''password'' => $password])) {
return redirect()->intended(''defaultpage'');
}
Para Laravel 4 (respuesta anterior)
En el momento de esta respuesta, no había un respaldo oficial del marco en sí. Hoy en día puedes usar el método señalado por bgdrl a continuación este método: (He intentado actualizar su respuesta, pero parece que no aceptará)
En el filtro de autenticación:
// redirect the user to "/login"
// and stores the url being accessed on session
Route::filter(''auth'', function() {
if (Auth::guest()) {
return Redirect::guest(''login'');
}
});
En la acción de inicio de sesión:
// redirect the user back to the intended page
// or defaultpage if there isn''t one
if (Auth::attempt([''email'' => $email, ''password'' => $password])) {
return Redirect::intended(''defaultpage'');
}
Para Laravel 3 (respuesta aún más antigua)
Podrías implementarlo así:
Route::filter(''auth'', function() {
// If there''s no user authenticated session
if (Auth::guest()) {
// Stores current url on session and redirect to login page
Session::put(''redirect'', URL::full());
return Redirect::to(''/login'');
}
if ($redirect = Session::get(''redirect'')) {
Session::forget(''redirect'');
return Redirect::to($redirect);
}
});
// on controller
public function get_login()
{
$this->layout->nest(''content'', ''auth.login'');
}
public function post_login()
{
$credentials = [
''username'' => Input::get(''email''),
''password'' => Input::get(''password'')
];
if (Auth::attempt($credentials)) {
return Redirect::to(''logged_in_homepage_here'');
}
return Redirect::to(''login'')->with_input();
}
Almacenar la redirección en Session tiene la ventaja de persistir incluso si el usuario omitió escribir sus credenciales o no tiene una cuenta y debe registrarse.
Esto también permite que cualquier cosa además de Auth establezca un redireccionamiento en la sesión y funcionará mágicamente.
¿Probaste esto en tu routes.php?
Route::group([''middleware'' => [''web'']], function () {
//
Route::get(''/'',''HomeController@index'');
});
Aquí está mi solución para 5.1. Necesitaba que alguien haga clic en el botón "Me gusta" en una publicación, que se le redireccionara para iniciar sesión y luego regrese a la página original. Si ya habían iniciado sesión, el href
del botón "Me gusta" fue interceptado con JavaScript y convertido en una solicitud AJAX.
El botón es algo así como <a href="/like/931">Like This Post!</a>
. /like/931
es manejado por un LikeController que requiere el middleware de auth
.
En el middleware de autenticación (la función handle()
), agregue algo como esto al inicio:
if(!str_contains($request->session()->previousUrl(), "/auth/login")) {
$request->session()->put(''redirectURL'', $request->session()->previousUrl());
$request->session()->save();
}
Cambie /auth/login
a cualquier URL que sea para iniciar sesión. Este código guarda la URL de la página original en la sesión a menos que la URL sea la URL de inicio de sesión. Esto es necesario porque parece que este middleware recibe dos llamadas. No estoy seguro de por qué o si eso es cierto. Pero si no verifica ese condicional, será igual a la página original correcta, y de alguna manera se convertirá en /auth/login
. Probablemente haya una manera más elegante de hacer esto.
Luego, en LikeController
o cualquier controlador que tenga, maneja la URL del botón que se encuentra en la página original:
//some code here that adds a like to the database
//...
return redirect($request->session()->get(''redirectURL''));
Este método es súper simple, no requiere anular ninguna función existente y funciona muy bien. Es posible que haya alguna manera más fácil para que Laravel haga esto, pero no estoy seguro de qué se trata. Usar la función intended()
no funciona en mi caso porque LikeController también necesitaba saber lo que la URL anterior debía redirigir a ella. Esencialmente dos niveles de redirección hacia atrás.
Cambie su constructor de LoginControllers a:
public function __construct()
{
session([''url.intended'' => url()->previous()]);
$this->redirectTo = session()->get(''url.intended'');
$this->middleware(''guest'')->except(''logout'');
}
Te redirigirá a la página ANTES de la página de inicio de sesión (2 páginas atrás).
Encontré esos dos excelentes métodos que pueden ser extremadamente útiles para ti.
Redirect::guest();
Redirect::intended();
Puede aplicar este filtro a las rutas que necesitan autenticación.
Route::filter(''auth'', function()
{
if (Auth::guest()) {
return Redirect::guest(''login'');
}
});
Lo que este método básicamente hace es almacenar la página que intentabas visitar y te redirige a la página de inicio de sesión .
Cuando el usuario está autenticado puede llamar
return Redirect::intended();
y te redirecciona a la página que intentabas alcanzar al principio.
Es una gran manera de hacerlo, aunque suelo usar el siguiente método.
Redirect::back()
Puedes consultar this blog increíble.
He estado usando esto por un tiempo en mi código de selector de idioma. Siempre y cuando solo necesites retroceder solo 1 página, funciona bien:
return Redirect::to(URL::previous());
No es la solución más poderosa que existe, pero es súper fácil y puede ayudar a resolver algunos acertijos. :)
Para Laravel 5.5 y probablemente 5.4
En App / Http / Middleware / RedirectIfAuthenticated change redirect (''/ home'') para redirigir () -> intended (''/ home'') en la función de manejo:
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect()->intended(''/home'');
}
return $next($request);
}
en App / Http / Controllers / Auth / LoginController crea la función showLoginForm () de la siguiente manera:
public function showLoginForm()
{
if(!session()->has(''url.intended''))
{
session([''url.intended'' => url()->previous()]);
}
return view(''auth.login'');
}
De esta forma, si hubiera una intención para otra página, redirigirá allí; de lo contrario, redirigirá a la página principal.
Para laravel 5. * prueba estos.
return redirect()->intended(''/'');
o
return Redirect::intended(''/'');
Puede usar la función redirigida :: prevista . Redirigirá al usuario a la URL a la que estaba intentando acceder antes de ser atrapado por el filtro de autenticación. Se puede dar un URI alternativo a este método en caso de que el destino no esté disponible.
En el inicio de sesión / registro:
return Redirect::intended(''defaultpageafterlogin'');
Use Redirect;
Luego usa esto:
return Redirect::back();
Larvel 5.3 esto realmente funcionó para mí simplemente actualizando LoginController.php
use Illuminate/Support/Facades/Session;
use Illuminate/Support/Facades/URL;
public function __construct()
{
$this->middleware(''guest'', [''except'' => ''logout'']);
Session::set(''backUrl'', URL::previous());
}
public function redirectTo()
{
return Session::get(''backUrl'') ? Session::get(''backUrl'') : $this->redirectTo;
}
ref: https://laracasts.com/discuss/channels/laravel/redirect-to-previous-page-after-login
Para Laravel 5.2 (versiones anteriores que no usé)
Pegue el código en la aplicación de archivos / Http / Controllers / Auth / AurhController.php
/**
* Overrides method in class ''AuthenticatesUsers''
*
* @return /Illuminate/Contracts/View/Factory|/Illuminate/View/View
*/
public function showLoginForm()
{
$view = property_exists($this, ''loginView'')
? $this->loginView : ''auth.authenticate'';
if (view()->exists($view)) {
return view($view);
}
/**
* seve the previous page in the session
*/
$previous_url = Session::get(''_previous.url'');
$ref = isset($_SERVER[''HTTP_REFERER'']) ? $_SERVER[''HTTP_REFERER''] : '''';
$ref = rtrim($ref, ''/'');
if ($previous_url != url(''login'')) {
Session::put(''referrer'', $ref);
if ($previous_url == $ref) {
Session::put(''url.intended'', $ref);
}
}
/**
* seve the previous page in the session
* end
*/
return view(''auth.login'');
}
/**
* Overrides method in class ''AuthenticatesUsers''
*
* @param Request $request
* @param $throttles
*
* @return /Illuminate/Http/RedirectResponse
*/
protected function handleUserWasAuthenticated(Request $request, $throttles)
{
if ($throttles) {
$this->clearLoginAttempts($request);
}
if (method_exists($this, ''authenticated'')) {
return $this->authenticated($request, Auth::guard($this->getGuard())->user());
}
/*return to the previous page*/
return redirect()->intended(Session::pull(''referrer''));
/*return redirect()->intended($this->redirectPath()); /*Larevel default*/
}
E importación de espacio de nombres: use Session;
Si no ha realizado ningún cambio en la aplicación de archivos / Http / Controllers / Auth / AurhController.php, puede simplemente reemplazarla con el archivo de GitHub
// Also place this code into base controller in contract function, because ever controller extends base controller
if(Auth::id) {
//here redirect your code or function
}
if (Auth::guest()) {
return Redirect::guest(''login'');
}
return Redirect::intended(''/'');
esto lo redirigirá a la página predeterminada de su proyecto, es decir, a la página de inicio.