2014-09-27 2 views
10

Vorrei modificare il campo password nel database quando si utilizza l'autenticazione Laravel. Voglio che la mia colonna nella tabella users abbia il nome passwd e non password. Ho provato a correre qualcosa di simile:Come modificare/Nome campo password personalizzato per l'autenticazione utente Laravel 4 e Laravel 5

Auth::attempt(array(
    'user_name' => 'admin', 
    'passwd' => 'hardpass', 
)); 

ma non funziona.

Ho anche provato ad aggiungere nel User modello la seguente funzione:

public function getAuthPassword() { 
    return $this->passwd; 
} 

ma cambia anche nulla. L'utente non è ancora stato autenticato. È possibile in Laravel modificare il nome del campo della password nel database?

+0

@JarekTkaczyk E 'vero, ma non c'è informazioni là per l'utente che vuole avere colonna password personalizzata nel database. OP ha menzionato solo usando 'getAuthPassword' ma per l'utente che sta cercando una soluzione non saprà ancora cosa fare. Ho pensato che questo Q & A sarebbe stato utile per gli altri utenti per risolvere questo problema passo dopo passo –

+1

Solo un suggerimento - la maggior parte delle volte le risposte più preziose sono quelle brevi e consise, che risolvono precisamente il problema. –

+0

@ MarcinNabiałek mi hai salvato la vita questo stupido campo personalizzato nel mio progetto mi ha guidato le banane – caro

risposta

45

Informazioni

È possibile modificare facilmente tutti gli altri campi nel database e li usa per l'autenticazione. L'unico problema è nel campo password.

In effetti il ​​campo password è in qualche modo codificato in Laravel (ma non nel modo in cui molti pensano) quindi non è possibile passare semplicemente l'array mentre si è passati alla domanda.

Per impostazione predefinita, se si passa array per attempt (e probabilmente altre funzioni Auth come validate o once) se lo si fa in questo modo:

conducente Eloquente
Auth::attempt(array(
    'user_name' => 'admin', 
    'password' => 'hardpass', 
)); 

default eseguire la seguente query:

select * from `users` where `user_name` = 'admin' limit 1; 

Dopo aver ottenuto questi dati dal database, confronta la password fornita con la proprietà password per l'oggetto Utente che è stato creato. Ma se si utilizza semplicemente

:

Auth::attempt(array(
    'user_name' => 'admin', 
    'passwd' => 'hardpass', 
)); 

la seguente query saranno disputate:

select * from `users` where `user_name` = 'admin' and `passwd` = 'hardpass' limit 1; 

e nessun utente sarà trovato nel database (in passwd di memorizzare la password hash). Questo perché Eloquent rimuove dalla query password ma utilizza qualsiasi altro dato per eseguire una query. Inoltre, se provi a utilizzare 'passwd' => Hash:make($data['password']) anche se l'utente verrà trovato, il confronto della password non funzionerà.

Soluzione

soluzione è abbastanza semplice. È necessario eseguire Auth::attempt in questo modo:

Auth::attempt(array(
    'user_name' => 'admin', 
    'password' => 'hardpass', 
)); 

Come si vede ancora passare password come chiave (anche se questa colonna non uscite in users tabella) perché solo in questo modo il driver Eloquente non lo userà per la costruzione di query .

Ora a User modello (app/models/User.php) file è necessario aggiungere la seguente funzione:

public function getAuthPassword() { 
    return $this->passwd; 
} 

Come vedete qui utilizzare la colonna che esiste realmente nel database: passwd.

Usando in questo modo è possibile avere una colonna con password denominata tutto ciò che si desidera e si può ancora utilizzare il driver Eloquent predefinito per esso.

dati campione per testare

ho creato test molto semplice per questo.

Hai solo bisogno di sostituire il file app/routes.php con il seguente:

Route::get('/', function() { 

    if (Auth::check()) { 
     echo "I'm logged in as " . Auth::user()->user_name . "<br />"; 
     echo "<a href='/logout'>Log out</a>"; 
    } else { 
     echo "I'm NOT logged in<br />"; 


     Auth::attempt(array(
      'user_name' => 'admin', 
      'password' => 'hardpass', 
     )); 


     if (Auth::check()) { 
      echo "Now I'm logged in as " . Auth::user()->user_name . "<br />"; 
      echo "<a href='/logout'>Log out</a>"; 
     } else { 
      echo "I'm still NOT logged in<br />"; 
     } 
    } 


}); 

Route::get('/logout', function() { 
    Auth::logout(); 
    return "You have been logged out"; 
}); 


Route::get('/db', function() { 

    if (!Schema::hasTable('users')) { 


     Schema::create('users', function ($table) { 
      $table->engine = 'InnoDB'; 
      $table->increments('id'); 
      $table->string('user_name', 60)->unique(); 
      $table->string('passwd', 256); 
      $table->rememberToken(); 
      $table->timestamps(); 
     }); 

     DB::table('users')->insert(
      [ 
       [ 
        'user_name' => 'admin', 
        'passwd' => Hash::make('hardpass'), 
       ] 
      ] 
     ); 
    } 

    echo "Table users has been created"; 
}); 
  1. Crea database vuoto e dati di connessione impostati in app/config/database.php
  2. Ora è possibile eseguire /db url per esempio http://localhost/yourprojectname/db solo per creare gli utenti tavolo.
  3. Ora è possibile eseguire / url per esempio http://localhost/yourprojectname/ - come si vede utente è connesso, anche se in users tabella nel database che non si dispone di una colonna password (i dati per l'autenticazione è stata passata come stringhe, senza alcuna forma, ma naturalmente nella vera applicazione le aggiungerai). È possibile eseguire questo URL ancora una volta - come si vede l'utente è ancora registrato in modo che funzioni come previsto.
  4. Se si fa clic su Log out link, verrà disconnesso

laravel 5 modifiche per sopra

Questa soluzione è stata testata in Larave 4.2.9 (tutto come sopra) e anche in laravel 5. in Laravel5 tutto funziona lo stesso, ma è necessario, naturalmente, modificare i file in differenti percorsi:

  1. User modello è in app/User.php file di
  2. percorsi sono in app/Http/routes.php file di
  3. file di configurazione del database è in config/database.php file di