まだまだ続くユーザ認証。今まではいわば基礎編みたいなもので、教科書通りの紹介。今回は、実践として、こういうときはどうする?みたいな応用編です。
まずは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);
となったわけです。
メルマガ購読の申し込みはこちらから。