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";
});
- Crea database vuoto e dati di connessione impostati in
app/config/database.php
- Ora è possibile eseguire
/db
url per esempio http://localhost/yourprojectname/db
solo per creare gli utenti tavolo.
- 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.
- 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:
User
modello è in app/User.php
file di
- percorsi sono in
app/Http/routes.php
file di
- file di configurazione del database è in
config/database.php
file di
@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 –
Solo un suggerimento - la maggior parte delle volte le risposte più preziose sono quelle brevi e consise, che risolvono precisamente il problema. –
@ MarcinNabiałek mi hai salvato la vita questo stupido campo personalizzato nel mio progetto mi ha guidato le banane – caro