情報
データベース内の他のすべてのフィールドを簡単に変更して、認証に使用できます。唯一の問題はpassword
フィールドです。
実際password
、フィールドは Laravel で何らかの方法でハードコーディングされているため (ただし、多くの人が考える方法ではありません)、質問で渡したように配列を渡すことはできません。
デフォルトでは、次のようにすると、配列(およびおそらくor などattempt
の他の Auth 関数) を渡す場合:validate
once
Auth::attempt(array(
'user_name' => 'admin',
'password' => 'hardpass',
));
デフォルトの Eloquent ドライバーは、次のクエリを実行します。
select * from `users` where `user_name` = 'admin' limit 1;
データベースからこのデータを取得した後、指定したパスワードと、作成されたユーザー オブジェクトのパスワード プロパティを比較します。
しかし、単に使用する場合:
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
- たとえば、users テーブルを作成するためだけに
/db
url を実行できます。http://localhost/yourprojectname/db
/
たとえば、urlを実行できます-データベースのテーブルに列がないhttp://localhost/yourprojectname/
場合でもユーザーがログインしていることがわかります(認証用のデータはフォームなしで文字列として渡されますが、もちろん実際のアプリケーションではそれらを追加します)。この URL をもう一度実行できます。ユーザーがまだログに記録されているため、期待どおりに機能しています。users
password
- リンクをクリック
Log out
するとログアウトされます
上記のLaravel 5の変更
このソリューションは、Larave 4.2.9 (上記のすべて) および Laravel 5 でもテストされました。Laravel5 では、すべて同じように機能しますが、もちろん異なるパスのファイルを編集する必要があります。
User
モデルはapp/User.php
ファイルにあります
- ルートは
app/Http/routes.php
ファイルにあります
- データベース構成ファイルはファイルにあり
config/database.php
ます