Laravel認証を使用するときにデータベースのパスワードフィールドを変更したい。users
テーブルの列の名前をpasswd
ではなくpassword
にしたい。次のようなものを実行しようとした。
Auth::attempt(array(
'user_name' => 'admin',
'passwd' => 'hardpass',
));
しかし、それは機能しません。
また、User
モデルに次の関数を追加しようとしました。
public function getAuthPassword() {
return $this->passwd;
}
しかし、それも何も変わりません。ユーザーはまだ認証されていません。 Laravelでデータベースのパスワードフィールド名を変更することは可能ですか?
データベース内の他のすべてのフィールドを簡単に変更して、認証に使用できます。唯一の問題はpassword
フィールドにあります。
実際、password
フィールドは何らかの方法でLaravel(多くの人が考える方法ではありません)にハードコードされているため、質問で渡したとおりに配列を渡すことはできません。
デフォルトでは、配列をattempt
(およびおそらくvalidate
やonce
などの他のAuth関数)に渡す場合、次のようにします。
_Auth::attempt(array(
'user_name' => 'admin',
'password' => 'hardpass',
));
_
デフォルトのEloquentドライバーは、次のクエリを実行します。
_select * from `users` where `user_name` = 'admin' limit 1;
_
データベースからこのデータを取得した後、指定したパスワードを、作成されたUserオブジェクトのpasswordプロパティと比較します。
しかし、単に使用する場合:
_Auth::attempt(array(
'user_name' => 'admin',
'passwd' => 'hardpass',
));
_
次のクエリが実行されます。
_select * from `users` where `user_name` = 'admin' and `passwd` = 'hardpass' limit 1;
_
データベースにはユーザーが見つかりません(passwd
にハッシュされたパスワードを保存します)。これは、Eloquentがクエリpassword
から削除しますが、他のデータを使用してクエリを実行するためです。また、ここで'passwd' => Hash:make($data['password'])
を使おうとすると、ユーザーは見つかりますが、パスワードの比較は機能しません。
解決策は非常に簡単です。次のように_Auth::attempt
_を実行する必要があります。
_Auth::attempt(array(
'user_name' => 'admin',
'password' => 'hardpass',
));
_
ご覧のとおり、キーとしてpassword
を渡します(ただし、この列はusers
テーブルに存在しません)。これは、この方法でのみEloquentドライバーがクエリの構築に使用しないためです。
ここで、User
モデル(_app/models/User.php
_)ファイルに、次の関数を追加する必要があります。
_public function getAuthPassword() {
return $this->passwd;
}
_
ご覧のとおり、ここではデータベースに実際に存在する列passwd
を使用しています。
このように使用すると、任意の名前のパスワードが付いた列を作成でき、デフォルトのEloquentドライバーを引き続き使用できます。
非常に簡単なテストを作成しました。
_app/routes.php
_ファイルを次のように置き換える必要があります。
_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";
});
_
app/config/database.php
_に設定します/db
_ url、たとえば_http://localhost/yourprojectname/db
_を実行して、ユーザーテーブルを作成できます。/
_ url、たとえば_http://localhost/yourprojectname/
_を実行できます。データベースのusers
テーブルにpassword
列がない場合でも、ユーザーがログインしていることがわかります。 (認証用のデータはフォームなしで文字列として渡されていますが、もちろん実際のアプリケーションではそれらを追加します)。このURLをもう一度実行できます。ユーザーはまだログに記録されているため、期待どおりに機能しています。Log out
_リンクをクリックすると、ログアウトされますこのソリューションは、Larave 4.2.9(上記のすべて)とLaravel 5)でテストされました。Laravel5ではすべてが同じように機能しますが、もちろん異なるパスでファイルを編集する必要があります。
User
モデルは_app/User.php
_ファイルにありますapp/Http/routes.php
_ファイルにありますconfig/database.php
_ファイルにあります