2013-06-14 18 views
8

Sto provando la classe Auth di Laravel ma ogni volta che tento di accedere a un utente, il metodo restituisce false. Qui è il mio codice:Laravel 4 Auth :: try() restituisce sempre false

routes.php

Route::get('new-user', function() { 
    return View::make('register'); 
}); 

Route::post('new-user', function() { 
    $name = Input::get('name'); 
    $email = Input::get('email'); 
    $password = Hash::make(Input::get('password')); 

    $user = new User; 
    $user->name = $name; 
    $user->email = $email; 
    $user->password = $password; 

    $user->save(); 
});  

Route::get('login', function() { 
     return View::make('login'); 
    }); 

    Route::post('login', function() { 

     $user = array(
      'email' => Input::get('email'), 
      'password' => Hash::make(Input::get('password')) 
     ); 

     if (Auth::attempt($user)) { 
      //return Redirect::intended('dashboard'); 
      return "ok."; 
     } else { 
      return "Wrong."; 
     } 

    }); 

viste/login.blade.php

{{ Form::open(array('url' => 'login', 'method' => 'post')) }} 

    <h1>Login:</h1> 

    <p> 
     {{ Form::label('email', 'Email: ') }} 
     {{ Form::text('email') }}<br /> 

     {{ Form::label('password', 'Password: ') }} 
     {{ Form::password('password') }}<br /> 
    </p> 

    <p> 
     {{ Form::submit('Login') }} 
    </p> 

{{ Form::close() }} 

config/auth.php

return array(

    'driver' => 'eloquent', 
    'model' => 'User', 
    'table' => 'users', 
    'reminder' => array(
     'email' => 'emails.auth.reminder', 'table' => 'password_reminders', 
    ), 

); 

Il database ha la posta elettronica & campi password e il campo password è varchar (60). Ogni volta che invio le informazioni di accesso a/login mi restituisce "Sbagliato". Non riesco davvero a vedere cosa c'è di sbagliato qui?

risposta

3

Non hash la password prima di tentativo:

$user = array(
     'email' => Input::get('email'), 
     'password' => Input::get('password') 
    ); 

    if (Auth::attempt($user)) { 
     //return Redirect::intended('dashboard'); 
     return "ok."; 
    } else { 
     return "Wrong."; 
    } 
+0

Ritorna ancora mi falso ("sbagliato".) – John

+1

Secondo la documentazione (http://four.laravel.com/docs/security#storing-passwords) Le password sono passato unhashed per tentare(). Sono sicuro che questo era un problema, ma potresti averne più di uno. Assicurati che la password sia correttamente salvata nella tabella degli utenti. –

+0

Ecco come immagazzino gli utenti nel database: 'Route :: post ('new-user', function() { $ name = Input :: get ('name'); $ email = Ingresso :: get ('e-mail'); $ password = Hash :: fanno (ingresso :: get ('password')); $ user = new user; $ user-> name = $ name; $ user-> email = $ e-mail; $ user-> password = $ password; $ user-> save(); }); ' dispiace io non so' come mostrare correttamente il codice qui. – John

6

Il codice è intercettazioni fuori perché si sta passando le variabili sbagliati per Auth::attempt(). Questo metodo richiede un array con le chiavi username, password e facoltativamente ricorda. In questa luce, il tuo codice sopra dovrebbe essere:

Route::post('login', function() 
{ 
    $credentials = [ 
     'username' => Input::get('email'), 
     'password' => Input::get('password') 
    ]; 

    dd(Auth::attempt($credentials)); 
}); 

Sperare che aiuti.

Inoltre, fornirò frammenti di codice aggiuntivo per migliorare il flusso di lavoro. Percorso per memorizzare nuovi utenti:

Route::post('register', function() 
{ 
    $input = Input::only(['username', 'email', 'password']); 

    // validate data 

    Eloquent::unguard(); 

    $user = User::create($input); 

    Auth::loginUsingId($user->id); 

    return Redirect::to('dashboard'); 
}); 

Poi, nel tuo modello utente aggiungere il metodo

public function setPasswordAttribute() 
{ 
    $this->password = Hash::make($this->password); 
} 

In questo modo la password sarà hash automaticamente ogni volta che viene impostato

0

Si dovrebbe implementare UserInterface classe previsto di laravel nella classe del tuo modello:

use Illuminate\Auth\UserInterface; 
use Illuminate\Auth\Reminders\RemindableInterface; 

class User extends Eloquent implements UserInterface, RemindableInterface 
{ 

E ricorda che ha 2 metodi astratti che dovresti dichiarare nel tuo modello. Puoi seguire l'originale User.php modello

0

Controlla la tua password Lunghezza. Deve essere 60 o superiore nel database.

0

non funziona perché auth :: tenta di convertire la password in hash utilizzando bcrypt e cerca l'hash nella tabella degli utenti in modo che corrisponda.

in breve la password deve essere un hash memorizzato nella tabella del database per auth :: tentare di funzionare.

questo è il motivo per cui la condizione if() non riesce.

è possibile utilizzare bcrypt (password) per memorizzare le password hash nel database e quindi utilizzare autenticazione :: tentativo

seguito da docs laravel

https://laravel.com/docs/5.2/authentication#authenticating-users

Il metodo accetta un tentativo matrice di coppie chiave/valore come primo argomento . I valori dell'array verranno utilizzati per trovare l'utente nella tabella del database. Quindi, nell'esempio sopra, l'utente sarà recuperato dal valore della colonna email. Se l'utente viene trovato, la password con hash memorizzata nel database verrà confrontata con il valore della password con hash passato al metodo tramite la matrice. Se le due password con hash corrispondono a una sessione autenticata, verrà avviato per l'utente.

Il metodo di tentativo restituisce true se l'autenticazione ha avuto esito positivo. In caso contrario, verrà restituito il falso.

Problemi correlati