2013-09-27 7 views
7

Sto provando a ottenere il pacchetto sentinella impostato correttamente nella mia app.redirect di laravel sentry :: destinato a non funzionare

Posso accedere a un utente in entrata e in uscita e proteggere i percorsi ma non riesco a ottenere il redirect::intended per funzionare correttamente. La mia comprensione è che un utente verrà riportato al percorso originariamente chiamato prima di essere indirizzato alla pagina di accesso. Al momento semplicemente continua a reindirizzare alla pagina predefinita.

Nel mio routes.php ho il seguente gruppo istituito:

Route::group(array('before' => 'sentryAuth'), function() {...} 

All'interno di questo gruppo ho messo tutti i percorsi protetti.

Nel mio filters.php Ho le seguenti filtri:

Route::filter('sentryAuth', function() { 

if (!Sentry::check()) { 

    return Redirect::route('login'); 
} 
}); 

percorso :: filtro ('sentryGuest', function() {

if (Sentry::check()) { 
    return Redirect::intended('dashboard'); 
} 
}); 

Nel mio UserController ho il seguente codice :

public function postAuthenticate() 
{ 
    try { 
     // Set login credentials 
     $credentials = array(
      'email' => Input::get('email'), 
      'password' => Input::get('password') 
     ); 

     // Try to authenticate the user 
     $user = Sentry::authenticate($credentials, false); 
    } catch (Cartalyst\Sentry\Users\LoginRequiredException $e) { 
     echo 'Login field is required.'; 
    } 
    catch (Cartalyst\Sentry\Users\PasswordRequiredException $e) { 
     echo 'Password field is required.'; 
    } 
    catch (Cartalyst\Sentry\Users\UserNotFoundException $e) { 
     echo 'User was not found.'; 
    } 
    catch (Cartalyst\Sentry\Users\WrongPasswordException $e) { 
     echo 'Wrong password, try again.'; 
    } 
    catch (Cartalyst\Sentry\Users\UserNotActivatedException $e) { 
     echo 'User is not activated.'; 
    } 

    if (!Sentry::check()) { 
     return Redirect::to('user/login'); 
    } else { 
     return Redirect::intended('dashboard'); 
    } 
} 

Ho provato ad accedere a una pagina "prenota/crea" senza effettuare l'accesso. o la pagina di accesso, accedi ma poi mi porta al dashboard non alle prenotazioni/creazioni.

AM Mi manca qualcosa qui? C'è un codice aggiuntivo di cui ho bisogno per ottenere l'intenzione di lavorare ??

risposta

8

Non sono sicuro di questo, perché non sto usando Sentry per il mio progetto attuale .. quindi questa è solo una sensazione.

Sembra che da quando si è utilizzato SentryAuth e non la classe nativa Auth in laravel 4, la voce di sessione per l'url previsto non è impostato .. Ho guardato sul API sulla classe Redirector e ho visto questo:

public function intended($default, $status = 302, $headers = array(), $secure = null) 
{ 
    $path = $this->session->get('url.intended', $default); 

    $this->session->forget('url.intended'); 

    return $this->to($path, $status, $headers, $secure); 
} 

e come dice il codice, la chiave di sessione è "url.intended". Ho verificato questo utilizzando il filtro Auth nativa e l'URL previsto è impostato su Session::get('url.intended') come previsto ..

quindi una possibile soluzione a questo è quello di impostare manualmente nella sessione. un esempio potrebbe essere:

Sul filtro

Route::filter('sentryAuth', function() { 

    if (!Sentry::check()) { 
     Session::put('loginRedirect', Request::url()); 
     return Redirect::route('login'); 
    } 
}); 

Sul postAuthenticate metodo()

if (!Sentry::check()) { 
    return Redirect::to('user/login'); 
} else { 
    // Get the page we were before 
    $redirect = Session::get('loginRedirect', 'dashboard'); 

    // Unset the page we were before from the session 
    Session::forget('loginRedirect'); 

    return Redirect::to($redirect); 
} 

parti del codice sono state prese da here per riferimento ..^_^

+0

risposta eccellente - i cambiamenti hanno lavorato e reindirizzare accade come previsto. Grazie – Ray

4

La risposta di @ reikyoushin è eccellente. Ecco una versione leggermente diversa.

percorsi.php

// NOTE: do NOT name your filter "auth" as it will not override 
//  Laravel's built-in auth filter and will not get executed 
Route::filter('sentryAuth', function() 
{ 
    // check if logged in or not 
    if (! Sentry::check()) 
    { 
     // the guest() method saves the intended URL in Session 
     return Redirect::guest('user/login'); 
    } else { 
     // now check permissions for the given route 
     $user = Sentry::getUser(); 
     if (! $user->hasAccess(Route::currentRouteName())) 
     { 
      // redirect to 403 page 
      return Response::make('Forbidden', 403); 
     } 
    } 
}); 

// Protected routes 
Route::group(array('before' => 'sentryAuth', function() 
{ 
    Route::get('admin', function() { return View::make('admin.index'); }); 
}); 

e nella funzione di login:

public function login() { 
    try { 
     $creds = array(
      'email' => Input::get('email'), 
      'password' => Input::get('password') 
     ); 
     $user = Sentry::authenticate($creds); 
     return Redirect::intended('dashboard'); 
    } catch (Exception $e) { 
     // handle exceptions 
    } 
} 
10

Nella tua filters.php assicurarsi di utilizzare:

return Redirect::guest('login'); 

invece di

return Redirect::route('login'); 

La guest la funzione imposterà t ha corretto le variabili di sessione per intended() per funzionare correttamente.

0

Il modo più semplice.

nel filtro Auth utilizzare il seguente:

Route::filter('sentryAuth', function() 
{ 
    if (! Sentry::check()) 
    {  
     return Redirect::guest(route('login')); 
    } 
}); 

nel controller:

public function postAuthenticate() 
{ 
    try { 
      $credentials = array(
      'email' => Input::get('email'), 
      'password' => Input::get('password') 
     ); 

     $user = Sentry::authenticate($credentials, false); 
    } catch() { 
     // validation errors 
    } 

    //firstly, Laravel will try to redirect intended page. 
    //if nothing saved in session, it will redirect to home. 
    //you can use any route instead of home. 

    return Redirect::intended(route('home')); 
} 

Fatto.

Al di fuori di Sentry:

Questo codice può essere utilizzato con qualsiasi tipo di libreria di autenticazione. Hai bisogno di due cose per implementare il reindirizzamento previsto:

1.in il filtro di autenticazione:

 
    Route::filter('auth', function() 
    { 
     if (! Sentry::check()) 
      { 
      return Redirect::guest(route('login')); 
      } 
    }); 

2. Dopo il login di un utente:

 
//firstly, Laravel will try to redirect intended page. 
//if nothing saved in session, it will redirect to home. 
//you can use any url instead of '/' 

return Redirect::intended('/'); 
Problemi correlati