まだまだ続くユーザ認証。今まではいわば基礎編みたいなもので、教科書通りの紹介。今回は、実践として、こういうときはどうする?みたいな応用編です。

まずは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のトレイト。以下を参照してください。

ユーザー認証(3)ログイン・ログアウト

ここで同じ名前のメソッドを使用して、クレデンシャルにユーザーが有効、つまり active_flag => 'Y'という条件を追加したいです。
しかし、ここではまず、すでに定義されているgetCredentialsの関数をコールしてからの追加としたい。問題は、

これでは、再帰となるし、

$credentials = $this->getCredentials($request);

スタテックのメソッドでも、継承したクラスのメソッドでもないのでこうともできない。

$credentials = parent::getCredentials($request);

それゆえに、

    use AuthenticatesAndRegistersUsers, ThrottlesLogins {
        getCredentials as getCredentialsTrait;
    }

として、オリジナルのメソッド名を改名して、

$credentials = $this->getCredentialsTrait($request);

となったわけです。

By khino