Usersテーブルのremember_token
を使用して、ユーザーをアプリケーションに認証することは安全ですか?
このトークンの目的は何ですか?現在、フォームでそれを使用して、ユーザーがログインしているかどうかを確認しています。トークンが存在しない場合は、ログイン画面を表示します。ユーザーがログアウトするたびに、このトークンが再生成されます。
いいえ。認証に使用することは想定されていません。フレームワークによってRemember Me
Cookieハイジャック。値は、ログインおよびログアウト時に更新されます。 Cookieが悪意のある人によってハイジャックされた場合、ログアウトすると、ハイジャックされたCookieは一致しなくなるため、役に立たなくなります。
次のドキュメントを参照してください。
Auth::logout()
が正しく機能するためには、remember_token
をユーザーテーブルの移行に追加する必要がありました。
remember_token
を移行に追加しました。
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUsersTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
//
Schema::create('users', function(Blueprint $table)
{
$table->increments('id');
$table->string('lname', 32);
$table->string('fname', 32);
$table->string('username', 32);
$table->string('email', 320);
$table->string('remember_token', 100);
$table->string('password', 64);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
Schema::drop('users');
}
}
コマンドラインからusersテーブルを削除してから、移行/シードする必要があります。
これが古い質問であったとしても、必要のない場合はトークンを使用しないオプションを提示したかった(たとえば、サイトに自分のオプションを覚えていない)。
Usersテーブルにダミーの列を追加する代わりに、Auth :: logout()が設定しないようにすることができます。
これをユーザーモデルに追加するだけです(Laravel 5.6の時点で機能します):
public function save(array $options = array()) {
if(isset($this->remember_token))
unset($this->remember_token);
return parent::save($options);
}
これにより、モデルが保存される直前に「remember_token」列が削除されるため、存在しない列が原因でエラーが発生することはありません。
Laravelは、非表示の入力に [〜#〜] csrf [〜#〜] トークンを提供し、ログインしているかどうかにかかわらず、フォームが送信されるたびに自動的に追加および検証します。 Form Builderを使用している場合、これを確認する必要もなく発生しています。
Auth
ファサードを使用して、送信時にユーザーがログインしているかどうかを確認する必要があります。