概要
Laravelプロジェクト作成時にUserモデルのapp/User.phpファイルが自動作成される。この中で、認証関係について調べてみた。
User.phpファイルの内容
app/User.phpの内容は以下のとおり。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<?php namespace App; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; class User extends Authenticatable { use Notifiable; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; /** * The attributes that should be cast to native types. * * @var array */ protected $casts = [ 'email_verified_at' => 'datetime', ]; } |
認証関係
UserクラスはModelクラスを(直接には)継承していないUserクラスはAuthenticatableクラスを継承しているAuthenticatableクラスはIlluminate\Foundation\Auth\Userのエイリアスとして定義されている。
Illuminate\Foundation\Auth\Userクラス
UserモデルクラスがAuthenticatbleクラスとして継承しているIlluminate\Foundation\Auth\Userクラスの要点は以下のとおり。
Modelクラスを継承している(L14)AuthenticatableContractインターフェイスを適用している(L15)AuthenticatableContractはIlluminate\Contracts\Auth\Authenticatableインターフェイスのエイリアス(L15)
AuthenticatableContractインターフェイスのメソッドは、Illuminate\Auth\Authenticatableトレイトで実装(L19, L5)
同じAuthenticatableという名前でインターフェイスとトレイトがあるのがややこしい。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php namespace Illuminate\Foundation\Auth; use Illuminate\Auth\Authenticatable; use Illuminate\Auth\MustVerifyEmail; use Illuminate\Auth\Passwords\CanResetPassword; use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract; use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract; use Illuminate\Database\Eloquent\Model; use Illuminate\Foundation\Auth\Access\Authorizable; class User extends Model implements AuthenticatableContract, AuthorizableContract, CanResetPasswordContract { use Authenticatable, Authorizable, CanResetPassword, MustVerifyEmail; } |
Authenticatableインターフェース
Illuminate\Contracts\Auth\Authenticatableインターフェイスは、識別子やパスワード、セッションに関する6つのメソッドの実装を要請する。
Userクラスでこのインターフェイスを適用する際には、エイリアスでAuthenticatbleContractという別名で扱っている。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php namespace Illuminate\Contracts\Auth; interface Authenticatable { // userの一意な識別子名をstringで返す public function getAuthIdentifierName(); // userの一意な識別子を返す(mixed型) public function getAuthIdentifier(); // userのパスワードをstringで返す public function getAuthPassword(); // "remember me"セッションのトークンをstringで返す public function getRememberToken(); // "remember me"セッションのトークンをstringで与えて設定する public function setRememberToken($value); // "remember me"トークンのカラム名をstringで返す public function getRememberTokenName(); } |
Authenticatableトレイト
Illuminate\Auth\Authenticatableトレイトは、Authenticatableインターフェイスで要請された6つのメソッドを実装する。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<?php namespace Illuminate\Auth; trait Authenticatable { // "remember me"トークンのカラム名 protected $rememberTokenName = 'remember_token'; // userの一意な識別子名をstringで返す public function getAuthIdentifierName() { return $this->getKeyName(); } // userの一意な識別子を返す(mixed型) public function getAuthIdentifier() { return $this->{$this->getAuthIdentifierName()}; } // userのパスワードをstringで返す public function getAuthPassword() { return $this->password; } // "remember me"セッションのトークンをstringで返す public function getRememberToken() { if (! empty($this->getRememberTokenName())) { return (string) $this->{$this->getRememberTokenName()}; } } // "remember me"セッションのトークンをstringで与えて設定する public function setRememberToken($value) { if (! empty($this->getRememberTokenName())) { $this->{$this->getRememberTokenName()} = $value; } } // "remember me"トークンのカラム名をstringで返す public function getRememberTokenName() { return $this->rememberTokenName; } } |
要約
要約すると、プロジェクトで生成されるUserクラスはIlluminate\Foundation\Auth\Userクラスを継承することによって、
Illuminate\Database\Eloquent\Modelクラスを継承しているAuthenticatableインターフェイスの6つのメソッドを実装している- これにより、ユーザー認証と継続セッションの機能が実装される。
通知関係
UserモデルクラスはIlluminate\Notifications\Notifiableトレイトを実装している。
|
1 2 3 4 5 6 7 8 |
..... use Illuminate\Notifications\Notifiable; class User extends Authenticatable { use Notifiable; .... } |
属性関係
$fillable
フォームのデータをマスアサインメントで取り込むための設定。
|
1 2 3 |
protected $fillable = [ 'name', 'email', 'password', ]; |
モデルを変換する際に、指定した属性を含めないための指定。
|
1 2 3 |
protected $hidden = [ 'password', 'remember_token', ]; |
$cast
データベースの読み込み時にstringから特定のデータ型にキャストするための指定。
|
1 2 3 |
protected $casts = [ 'email_verified_at' => 'datetime', ]; |
マイグレーションファイル
Userモデルクラスファイルとともに、以下のマイグレーションファイルもLaravelにより生成される。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('users', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name'); $table->string('email')->unique(); $table->datetime('email_verified_at')->nullable(); $table->string('password'); $table->rememberToken(); $table->datetime('created_at'); $table->datetime('updated_at'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('users'); } } |
artisan migrateコマンドで生成されたテーブルの構造は以下のとおり。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
mysql> DESCRIBE users; +-------------------+-----------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------------+-----------------+------+-----+---------+----------------+ | id | bigint unsigned | NO | PRI | NULL | auto_increment | | name | varchar(255) | NO | | NULL | | | email | varchar(255) | NO | UNI | NULL | | | email_verified_at | datetime | YES | | NULL | | | password | varchar(255) | NO | | NULL | | | remember_token | varchar(100) | YES | | NULL | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | | +-------------------+-----------------+------+-----+---------+----------------+ 8 rows in set (0.02 sec) |
ユーザー認証
基本的なユーザー認証の設定はこちらを参照。
また、ユーザー登録処理の内容、ログイン処理の内容についてはそれぞれのリンクを参照。