2013-08-18 5 views
6

Ho una classe utente composta da due tipi di utenti e che consente a utenti diversi di accedere a pagine diverse.Disconnessione con autenticazione di base HTTP in Laravel

ho creato un filtro come segue

Route::filter('isExpert', function() 
{ 
    $userIsExpert = 0; 
    $userIsLoggedIn = Auth::check(); 
    if ($userIsLoggedIn && Auth::user()->role == 'expert') { 
    $userIsExpert = 1; 
    } 

    Log::info('Logged in: ' . $userIsLoggedIn . ' && Expert: ' . $userIsExpert); 
    if ($userIsExpert == 0) 
    { 
     Log::info('should be logging out now.'); 
     Auth::logout(); 
     return Auth::basic(); 
    } 
}); 

e il routing in questo modo

Route::get('/winners', array('before' => 'isExpert', function() 
{ 
    $winners = DB::select('select * from winners'); 
    return View::make('winners.index')->with('winners',$winners); 
})); 

Il pensiero è questo: Se non è un esperto, sarà il logout e reindirizzare alla pagina di login. Se lo è, continuerà semplicemente. Tuttavia, Auth :: logout(); non disconnette mai l'utente.

Domanda

Perché non è Auth :: il logout() lavoro? Ho provato a posizionarlo ovunque nell'app senza alcun risultato.

applausi

+1

Provare a reindirizzare su un percorso diverso invece di restituire la risposta 'Auth :: basic()'. Tecnicamente il tuo codice dovrebbe funzionare.Puoi anche provare un 'dd (Auth :: check())' dopo aver effettuato il logout per vedere se il logout ha funzionato correttamente. –

+0

Ok. La funzione di reindirizzamento funziona, posso mettere in una vista lì e si spegne. Auth :: logout() non funziona in nessun punto dell'app. Qualche idea, perché? –

risposta

7

Ho avuto lo stesso problema, ho davvero non poteva il logout dell'utente corrente ... E la risposta è semplice: laravel non supporta il logout() con Auth :: base().

Ci sono modi per risolverlo, ma non è molto pulito; https://www.google.nl/search?q=logout+basic

3

Il modo più semplice che ho trovato è quello di reindirizzare a nome utente/password non validi sul percorso di logout. Esempio:

Route::get('admin/logout', function() { 
    return Redirect::to(preg_replace("/:\/\//", "://log-me-out:[email protected]", url('admin/logout'))); 
}); 
+0

Ogni volta che provo, ottengo 500 errori del server poiché si trova in un ciclo di reindirizzamento. – Kingsley

3

Questa non è una limitazione a Laravel, l'autorizzazione HTTP di base non è progettata per gestire la disconnessione. Il client rimarrà connesso fino alla chiusura del browser.

L'autorizzazione di base HTTP non deve essere utilizzata in nessun ambiente di produzione pubblico. Ecco alcuni motivi per cui:

  • Nessun modo di fornire agli utenti un'opzione "ricordami" nel modulo di accesso.
  • I gestori di password non hanno o non hanno il supporto per l'autenticazione di base HTTP, in quanto non è visualizzato HTML ma è un popup nativo.
  • Terribile esperienza utente. Mettere insieme un modulo di login appropriato vale il poco tempo necessario.

L'unico caso valido che posso pensare è proteggere i sottodomini di sviluppo pubblico come dev.example.com, ma ci sono modi migliori per risolvere anche questo.

0

Se implementato questi metodi in User.php

/** 
* Get the e-mail address where password reminders are sent. 
* 
* @return string 
*/ 
public function getReminderEmail() 
{ 
    return $this->email; 
} 

public function getRememberToken() 
{ 
    return $this->remember_token; 
} 

public function setRememberToken($value) 
{ 
    $this->remember_token = $value; 
} 
    public function getRememberTokenName() 
{ 
    return 'remember_token'; 
} 

Inserisci nuova colonna con nome 'remember_token' al vostro tavolo 'utenti' nel database mysql, e poi uscire, finalmente risolto con successo. alternarsi voi uso da tavolo, questo comando SQL:

ALTER TABLE users ADD remember_token TEXT; 

e poi il tasto 'Go' premere.