概要
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) |
ユーザー認証
基本的なユーザー認証の設定はこちらを参照。
また、ユーザー登録処理の内容、ログイン処理の内容についてはそれぞれのリンクを参照。