まだまだ続くユーザ認証。今まではいわば基礎編みたいなもので、教科書通りの紹介。今回は、実践として、こういうときはどうする?みたいな応用編です。
まずはDBテーブルusers
の構成を見るところから。
+----------------+------------------+------+-----+---------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+------------------+------+-----+---------------------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | active_flag | char(1) | NO | | | | | name | varchar(255) | NO | | NULL | | | email | varchar(255) | NO | UNI | NULL | | | password | varchar(60) | NO | | NULL | | | remember_token | varchar(100) | YES | | NULL | | | created_at | timestamp | NO | | 0000-00-00 00:00:00 | | | updated_at | timestamp | NO | | 0000-00-00 00:00:00 | | +----------------+------------------+------+-----+---------------------+----------------+
ごく簡単な構成です。しかし、実際にはユーザーはすでに退会したかとか、問題があるユーザーをブロックする必要がある、のような理由で、有効・無効のフラッグをつけるのが一般的です。
ということで、active_flag
としてusers
のフィールドを追加してみましょう。このactive_flag
は、char(1)
として有効はY
、無効はN
の値とします。
migrationを作成して、以下のように編集して実行。
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class AddActiveFlagToUsers extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('users', function ($table) { $table->char('active_flag', 1)->after('id'); }); } ... }
さて、今度は認証のプログラムの変更です。ユーザーのログインとパスワードがマッチかつユーザーが有効のときだけに認証を成功としたいです。さて、どこを変更すればよいのでしょうか?
これは以下のAuthController.php
にトレイトで定義されているメソッドの追加となります。
namespace App\Http\Controllers\Auth; use App\User; use Validator; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\ThrottlesLogins; use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers; use Illuminate\Http\Request; class AuthController extends Controller { use AuthenticatesAndRegistersUsers, ThrottlesLogins { getCredentials as getCredentialsTrait; } public function __construct() { $this->middleware('guest', ['except' => 'getLogout']); $this->maxLoginAttempts = 5; $this->lockoutTime = 60; } protected function getCredentials(Request $request) { $credentials = $this->getCredentialsTrait($request); $credentials['active_flag'] = 'Y'; return $credentials; } ...
getCredentials
は、AuthenticateAndRegistsUsers
トレイトの中で使用されているAuthenticatesUsers
のトレイト。以下を参照してください。
ここで同じ名前のメソッドを使用して、クレデンシャルにユーザーが有効、つまり active_flag => 'Y'
という条件を追加したいです。
しかし、ここではまず、すでに定義されているgetCredentials
の関数をコールしてからの追加としたい。問題は、
これでは、再帰となるし、
$credentials = $this->getCredentials($request);
スタテックのメソッドでも、継承したクラスのメソッドでもないのでこうともできない。
$credentials = parent::getCredentials($request);
それゆえに、
use AuthenticatesAndRegistersUsers, ThrottlesLogins { getCredentials as getCredentialsTrait; }
として、オリジナルのメソッド名を改名して、
$credentials = $this->getCredentialsTrait($request);
となったわけです。
メルマガ購読の申し込みはこちらから。