イントロダクション
Laravelでは簡単に認証が実装できます。実際ほとんど全て最初から設定済みです。認証の設定ファイルはconfig/auth.php
に用意してあり、認証サービスの振る舞いを調整できるように、読みやすいコメント付きでたくさんのオプションが用意されています。
データベースの検討事項
デフォルトととしてLaravelは、App\User
Eloquentモデルをapp
ディレクトリーに用意しています。このモデルはデフォルトEloquent認証ドライバーで使用しています。もしアプリケーションでEloquentを使用しなければ、Laravelクエリービルダーを使用するdatabase
認証ドライバーを使用する必要があります。
App\User
モデルのデータベーススキーマを構築する場合は、passwordカラムを最低60文字確実に確保してください。
さらにusers
、もしくは同等の働きをするテーブルには100文字のremember_token
文字列カラムも含めてください。このカラムはアプリケーションが管理する"remember
me"セッションのトークンを保存しておくカラムです。マイグレーションで$table->rememberToken();
を実行すると用意されます。
認証クイックスタート
Laravelでは認証に関連する2つのコントローラーがApp\Http\Controllers\Auth
名前空間下に用意されています。AuthController
は新ユーザーの登録と「ログイン」を処理します。もうひとつのPasswordController
には、登録済みユーザーがパスワードを忘れた時にリセットするためのロジックが準備されています。必要なメソッドを読み込むために両方のコントローラーでトレイトが使われています。多くのアプリケーションで、これらのコントローラーを変更する必要は全く無いでしょう。
ルート定義
認証コントローラーへリクエストを送るルートはデフォルトで含まれていません。app/Http/routes.php
へ自分で以下の定義を追加してください。
// 認証のルート定義…
Route::get('auth/login', 'Auth\AuthController@getLogin');
Route::post('auth/login', 'Auth\AuthController@postLogin');
Route::get('auth/logout', 'Auth\AuthController@getLogout');
// 登録のルート定義…
Route::get('auth/register', 'Auth\AuthController@getRegister');
Route::post('auth/register', 'Auth\AuthController@postRegister');
ビュー
認証のコントローラーはフレームワークに含まれていますが、これらのコントローラーがレンダーするビューは用意する必要があります。ビューはresources/views/auth
に設置します。これらのビューはお好きなようにカスタマイズしてください。ロジックのビューはresources/views/auth/login.blade.php
へ、登録のビューはresources/views/auth/register.blade.php
へ設置してください。
サンプル認証フォーム
<!-- resources/views/auth/login.blade.php -->
<form method="POST" action="/auth/login">
{!! csrf_field() !!}
<div>
メールアドレス
<input type="email" name="email" value="{{ old('email') }}">
</div>
<div>
パスワード
<input type="password" name="password" id="password">
</div>
<div>
<input type="checkbox" name="remember"> ログインを継続する
</div>
<div>
<button type="submit">ログイン</button>
</div>
</form>
サンプル登録フォーム
<!-- resources/views/auth/register.blade.php -->
<form method="POST" action="/auth/register">
{!! csrf_field() !!}
<div>
ユーザー名
<input type="text" name="name" value="{{ old('name') }}">
</div>
<div>
メールアドレス
<input type="email" name="email" value="{{ old('email') }}">
</div>
<div>
パスワード
<input type="password" name="password">
</div>
<div>
パスワード確認
<input type="password" name="password_confirmation">
</div>
<div>
<button type="submit">登録</button>
</div>
</form>
認証
これで用意されている認証コントローラーのルートとビューができました。アプリケーションに新しいユーザーを登録し、認証する準備が整いました。ブラウザで定義したルートへアクセスしてください。認証コントローラーは既にトレイトにより存在しているユーザーの認証と、新しいユーザーをデータベースに保存するロジックを持っています。
ユーザーが認証されるとデフォルトで/home
URIへリダイレクトされますが、このルートを変更する必要があるでしょう。認証後のリダイレクト場所はAuthController
のredirectPath
プロパティを定義することでカスタマイズできます。
protected $redirectPath = '/dashboard';
ユーザーが認証されていないと/auth/login
URIへリダイレクトされます。認証されていない時のリダイレクト先はAuthController
のloginPath
プロパティでデフォルトを指定できます。
protected $loginPath = '/login';
ユーザーが保護されているルートへアクセスしようとし、送り返される先をloginPath
は変更しません。App\Http\Middleware\Authenticate
ミドルウェアのhandle
メソッドにより制御されています。
カスタマイズ
アプリケーションに新しいユーザーを登録する場合に入力してもらうフォームのフィールドを変更するか、データベースに新しいユーザーレコードの登録方法をカスタマイズしたい場合は、AuthController
クラスを変更してください。このクラスはアプリケーションで新しいユーザーのバリデーションと作成に責任を持っています。
AuthController
のvalidator
メソッドはアプリケーションの新しいユーザーに対するバリデーションルールで構成されています。このメソッドはお気に召すまま自由に変更してください。
AuthController
のcreate
メソッドは新しいApp\User
レコードをEloquent
ORMを使用し、データベースに作成することに責任を持っています。データベースの必要に合わせて自由にこのメソッドを変更してください。
認証済みユーザーの取得
Auth
ファサードを使えば認証済みユーザーへ簡単にアクセスできます。
$user = Auth::user();
もしくは、一度ユーザーが認証されたら、Illuminate\Http\Request
インスタンスを通じ、ユーザーへアクセスできます。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class ProfileController extends Controller
{
/**
* ユーザープロフィールの項新
*
* @param Request $request
* @return Response
*/
public function updateProfile(Request $request)
{
if ($request->user()) {
// $request->user()は認証済みユーザーのインスタンスを返す…
}
}
}
現在のユーザーが認証されているか調べる
ユーザーが既にアプリケーションにログインしているかを調べるには、Auth
ファサードのcheck
メソッドが使えます。認証時にtrue
を返します。
if (Auth::check()) {
// ユーザーはログイン済み…
}
しかし特定のルートやコントローラーにユーザーがアクセスする前に、認証済みであるかをミドルウェアにより確認することもできます。より詳細についてはルートの保護のドキュメントを参照してください。
ルートの保護
ルートミドルウェアは特定のルートに許可されたユーザーのみアクセスを許すために使われます。Laravelにはapp\Http\Middleware\Authenticate.php
の中で定義されているauth
ミドルウェアが最初から用意されています。ルートの定義にこのミドルウェアを指定するだけです。
// ルートクロージャー使用時…
Route::get('profile', ['middleware' => 'auth', function() {
// 認証済みのユーザーのみ入れる…
}]);
// コントローラー使用時…
Route::get('profile', [
'middleware' => 'auth',
'uses' => 'ProfileController@show'
]);
もちろんコントローラークラスを使っているならルート定義に付加する代わりに、コントローラーのコンストラクターでmiddleware
メソッドを呼び出すことができます。
public function __construct()
{
$this->middleware('auth');
}
認証制限
Laravelの組み込みAuthController
クラスを使用している場合に、アプリケーションのログイン制限を行うにはIlluminate\Foundation\Auth\ThrottlesLogins
トレイトをuseします。デフォルトでは何度も正しくログインできなかった後、一分間ログインできなくなります。制限はユーザーの名前/メールアドレスとIPアドレスで限定されます。
<?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;
class AuthController extends Controller
{
use AuthenticatesAndRegistersUsers, ThrottlesLogins;
// 後略…
}
自前のユーザー認証
もちろん、Laravelに含まれる認証コントローラーを使うことを強要しているわけでありません。これらのコントローラーを削除する選択肢を選ぶのなら、Laravel認証クラスを直接使用しユーザーの認証を管理する必要があります。心配ありません。それでも簡単です!
Laravelの認証サービスにはAuth
ファサードでアクセスできます。クラスの最初でAuth
ファサードを確実にインポートしておきましょう。次にattempt
メソッドを見てみましょう。
<?php
namespace App\Http\Controllers;
use Auth;
use Illuminate\Routing\Controller;
class AuthController extends Controller
{
/**
* 認証の確認作業を処理する
*
* @return Response
*/
public function authenticate()
{
if (Auth::attempt(['email' => $email, 'password' => $password])) {
// 認証通過…
return redirect()->intended('dashboard');
}
}
}
attempt
メソッドは最初の引数として、キー/値ペアの配列を受け取ります。配列中の他の値は、データベーステーブルの中からそのユーザーを見つけるために使用されます。ですから、上の例ではemail
カラムの値により、ユーザーが取得されます。ユーザーが見つかれば、配列でメソッドに渡されたハッシュ済みのpassword
値と、データベースに保存してあったハッシュ済みpassword
が比較されます。2つのハッシュ済みパスワードが一致したら、そのユーザーの新しい認証セッションが開始されます。
attempt
メソッドは、認証が成功すればtrue
を返します。失敗時はfalse
を返します。
リダイレクタ―のintended
メソッドは、認証フィルターにかかる前にアクセスしようとしていたURLへ、ユーザーをリダイレクトしてくれます。そのリダイレクトが不可能な場合の移動先として、フォールバックURIをこのメソッドに指定できます。
お望みであれば、ユーザーのメールアドレスとパスワードに付け加え、認証時のクエリーに追加の条件を指定することも可能です。
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
// ユーザーは存在し、アクティブで、利用停止されていない
}
アプリケーションからユーザーをログアウトさせるには、Auth
ファサードのlogout
メソッドを使用してください。これはユーザーセッションの認証情報をクリアします。
Auth::logout();
注意: この例のように、
ユーザの継続ログイン
アプリケーションでログイン維持(Remember
me)機能を持たせたい場合は、attempt
メソッドの第2引数に論理値を指定します。ユーザーが自分でログアウトしない限り、認証が無期限に持続するようになります。もちろん、"remember
me"トークンを保存するために使用する文字列のremember_token
カラムをusers
テーブルに持たせる必要があります。
if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
// $rememberがtrueであれば、このユーザーは覚えられた…
}
この機能を使用している時に、ユーザーが"remember
me"クッキーを使用して認証されているかを判定するには、viaRemember
メソッドを使用します。
if (Auth::viaRemember()) {
//
}
他の認証方法
Userインスタンスによる認証
既に存在しているユーザーインスタンスでアプリケーションにログインさせる必要があれば、login
メソッドにそのユーザーインスタンスを指定し呼び出してください。指定されたオブジェクトはIlluminate\Contracts\Auth\Authenticatable
契約を実装している必要があります。もちろん、Laravelが用意しているApp\User
モデルはこのインターフェイスを実装しています。
Auth::login($user);
IDによるユーザー認証
ユーザーをアプリケーションへIDによりログインさせる場合は、loginUsingId
メソッドを使います。このメソッドは認証させたいユーザーの主キーだけを引数に受け取ります。
Auth::loginUsingId(1);
ユーザーを一度だけ認証する
once
メソッドを使用すると、アプリケーションにユーザーをそのリクエストの間だけログインさせることができます。セッションもクッキーも使用されないので、ステートレスなAPIを構築する場合に便利です。once
メソッドの引数はattempt
メソッドと同じです。
if (Auth::once($credentials)) {
//
}
HTTP基本認証
HTTP基本認証により、専用の「ログイン」ページを用意しなくても手っ取り早くアプリケーションにユーザーをログインさせられます。これを使用するには、ルートにauth.basic
ミドルウェアを付けてください。auth.basic
ミドルウェアはLaravelフレームワークに含まれているので、定義する必要はありません。
Route::get('profile', ['middleware' => 'auth.basic', function() {
// 認証済みユーザーのみが入れる…
}]);
ミドルウェアをルートに指定すれば、ブラウザーからこのルートへアクセスされると自動的に認証が求められます。デフォルトでは、auth.basic
ミドルウェアはユーザーを決める"username"としてユーザーのemail
カラムを使用します。
FastCGIの注意
PHP
FastCGIを使用している場合、初期状態のままでHTTP基本認証は正しく動作しないでしょう。以下の行を.htaccess
ファイルへ追加してください。
RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
ステートレスなHTTP基本認証
セッションの識別クッキーを用いずにHTTP基本認証を使用することもできます。これは特にAPI認証に便利です。実装するには、onceBasic
メソッドを呼び出すミドルウェアを定義してください。onceBasic
メソッドが何もレスポンスを返さなかった場合、リクエストをアプリケーションの先の処理へ通します。
<?php
namespace Illuminate\Auth\Middleware;
use Auth;
use Closure;
class AuthenticateOnceWithBasicAuth
{
/**
* やって来たリクエストの処理
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return Auth::onceBasic() ?: $next($request);
}
}
次にルートミドルウェアを登録し、ルートに付加します。
Route::get('api/user', ['middleware' => 'auth.basic.once', function() {
// 認証済みのユーザーのみ入れる…
}]);
パスワードリセット
データベースの検討事項
ほとんどのWebアプリケーションは、パスワードを忘れた場合にリセットする機能をユーザーへ提供しています。アプリケーションを構築するたびごと、何度も実装しなくても済むように、Laravelはパスワードリマインダーを送信し、パスワードをリセットするための便利な手法を提供しています。
これを利用するには、App\User
モデルがIlluminate\Contracts\Auth\CanResetPassword
契約を実装しているか確認してください。もちろん、フレームワークに用意されているApp\User
モデルでは、既にこのインターフェイスが実装されています。Illuminate\Auth\Passwords\CanResetPassword
トレイトで、このインターフェイスで実装する必要のあるメソッドが定義されています。
リセットトークンテーブルマイグレーションの生成
次にパスワードリセットトークンを保存しておくためのテーブルを作成します。このテーブルのマイグレーションは、最初からLaravelのdatabase/migrations
ディレクトリーに含まれています。ですから、マイグレートするために必要なのは次のコマンド実行だけです。
php artisan migrate
ルーティング
Laravelが用意しているAuth\PasswordController
はユーザーパスワードをリセットするために必要なロジックを持っています。しかし、このコントローラーに対するルートは定義する必要があります。
// パスワードリセットリンクを要求するルート…
Route::get('password/email', 'Auth\PasswordController@getEmail');
Route::post('password/email', 'Auth\PasswordController@postEmail');
// パスワードリセットルート
Route::get('password/reset/{token}', 'Auth\PasswordController@getReset');
Route::post('password/reset', 'Auth\PasswordController@postReset');
ビュー
PasswordController
へのルート定義に加え、このコントローラーにより返されるビューを準備する必要もあります。心配ありません。取り掛かりやすいようにサンプルビューを提供します。もちろん、お好きなようにフォームを変更してください。
パスワードリセットリンクのリクエストサンプルフォーム
パスワードリセットフォームのためにHTMLビューを用意する必要があります。このビューはresources/views/auth/password.blade.php
として設置します。このフォームは、パスワードのリセットリンクを受け付けるため、ユーザーのメールアドレスを指定するフィールドを一つ持っています。
<!-- resources/views/auth/password.blade.php -->
<form method="POST" action="/password/email">
{!! csrf_field() !!}
@if (count($errors) > 0)
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
@endif
<div>
Email
<input type="email" name="email" value="{{ old('email') }}">
</div>
<div>
<button type="submit">
パスワードリセットリンクの送信
</button>
</div>
</form>
ユーザーがパスワードのリセットをリクエストすると、PasswordController
のgetReset
メソッドへのリンクを含んだメールを受け取ることになります。通常、ルートは/password/reset
です。このメールのビューはresources/views/emails/password.blade.php
です。このビューは、パスワードのリセットを要求したユーザーであるかどうかを確認するための、パスワードリセットトークンを持つ$token変数を受け取ります。取り掛かりやすいでしょうから、メールのサンプルもどうぞ。
<!-- resources/views/emails/password.blade.php -->
パスワードをリセットするためにリンクをクリックしてください。 {{ url('password/reset/'.$token) }}
パスワードリセットサンプルフォーム
ユーザーがパスワードをリセットするためにメールの中のリンクをクリックすると、パスワードリセットフォームが表示されます。このビューはresources/views/auth/reset.blade.php
へ用意してください。
サンプルパスワードフォームをどうぞ。
<!-- resources/views/auth/reset.blade.php -->
<form method="POST" action="/password/reset">
{!! csrf_field() !!}
<input type="hidden" name="token" value="{{ $token }}">
@if (count($errors) > 0)
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
@endif
<div>
メールアドレス
<input type="email" name="email" value="{{ old('email') }}">
</div>
<div>
パスワード
<input type="password" name="password">
</div>
<div>
パスワード確認
<input type="password" name="password_confirmation">
</div>
<div>
<button type="submit">
パスワードリセット
</button>
</div>
</form>
パスワードリセット後の処理
ユーザーのパスワードリセットのためにルートとビューを定義したら、あとはブラウザでアクセスしてもらうだけです。フレームワークが用意しているPasswordController
にはパスワードリセットリンクのメール送信し、データベースのパスワードを更新するロジックが用意されています。
パスワードがリセットされたら、そのユーザーは自動的にアプリケーションにログインされ、/home
へリダイレクトされます。パスワードリセット後のリダイレクト先をカスタマイズするには、PasswordController
のredirectTo
プロパティを定義してください。
protected $redirectTo = '/dashboard';
注意: パスワードリセットトークンの有効時間はデフォルトで1時間です。
config/auth.php
ファイルの中のreminder.expire
オプションで変更できます。
ソーシャル認証
典型的なフォームを元にした認証に加え、LaravelはLaravel Socialite(ソシエリート:名士)による、OAuthプロバイダーを利用した簡単で便利な認証方法も提供します。Socialiteは現在、Facebook、Twitter、LinkedIn、Google、GitHub、Bitbucketをサポートしています。
Socialiteを使用する場合、composer.json
にパッケージを追加してください。
composer require laravel/socialite
設定
Socialiteライブラリをインストールしたら、config/app.php
設定ファイルにLaravel\Socialite\SocialiteServiceProvider
を登録してください。
'providers' => [
// 他のサービスプロバイダー
Laravel\Socialite\SocialiteServiceProvider::class,
],
さらに、app
設定ファイルのaliases
配列に、Socialite
ファサードを追加してください。
'Socialite' => Laravel\Socialite\Facades\Socialite::class,
続いてアプリケーションで使用するOAuthサービスの認証情報を追加する必要があります。認証情報はconfig/services.php
設定ファイルで指定します。アプリケーションに必要なプロバイダーによりfacebook
、twitter
、linkedin
、google
、github
、bitbucket
のキーを設定してください。
'github' => [
'client_id' => 'あなたの-github-app-id',
'client_secret' => 'あなたの-github-app-secret',
'redirect' => 'http://あなたの-callback-url',
],
基本的な使用法
これでユーザーを認証する準備ができました!2つのルートを定義する必要があります。一つはOAuthプロバイダーへユーザーをリダイレクトするルート、もう一つは認証後にプロバイダーからのコールバックを受け取るルートです。以下の例では、Socialize
ファサードを使用しています。
<?php
namespace App\Http\Controllers;
use Socialite;
use Illuminate\Routing\Controller;
class AuthController extends Controller
{
/**
* ユーザーをGitHubの認証ページヘリダイレクト
*
* @return Response
*/
public function redirectToProvider()
{
return Socialite::driver('github')->redirect();
}
/**
* ユーザーの情報をGitHubから取得
*
* @return Response
*/
public function handleProviderCallback()
{
$user = Socialite::driver('github')->user();
// $user->token;
}
}
redirect
メソッドはユーザーをOAuthプロバイダーへ送る面倒を見ます。一方のuser
メソッドはリクエストを読み、プロバーダーからのユーザー情報を取得します。ユーザーをリダイレクトする前に、そのリクエストへscopes
メソッドで「スコープ」を指定することもできます。このメソッドは既存のスコープを全てオーバーライトします。
return Socialite::driver('github')
->scopes(['scope1', 'scope2'])->redirect();
当然ながらコントローラーメソッドへのルートを定義する必要があります。
Route::get('auth/github', 'Auth\AuthController@redirectToProvider');
Route::get('auth/github/callback', 'Auth\AuthController@handleProviderCallback');
多くのOAuthプロバイダーはリダイレクトリクエストでオプションのパラメーターをサポートしています。リクエストにオプションのパラメーターを含めるには連想配列をwith
メソッドに渡し、呼び出してください。
return Socialite::driver('google')
->with(['hd' => 'example.com'])->redirect();
ユーザーの詳細の取得
ユーザーのインスタンスを取得したら、そのユーザーに関する詳細情報をさらに得られます。
$user = Socialite::driver('github')->user();
// OAuth Two プロバイダー
$token = $user->token;
// OAuth One プロバイダー
$token = $user->token;
$tokenSecret = $user->tokenSecret;
// 全プロバイダー
$user->getId();
$user->getNickname();
$user->getName();
$user->getEmail();
$user->getAvatar();
カスタム認証ドライバーの追加
ユーザーを保存するために伝統的なリレーショナル・データベースを使用していないのなら、自分の認証ドライバー作成するためにLaravelを拡張する必要があります。Auth
ファサードのextends
メソッドで、カスタムドライバーを定義できます。通常extends
は、サービスプロバイダーの中で呼び出します。
<?php
namespace App\Providers;
use Auth;
use App\Extensions\RiakUserProvider;
use Illuminate\Support\ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
/**
* 登録後のサービスの起動処理を実行
*
* @return void
*/
public function boot()
{
Auth::extend('riak', function($app) {
// Illuminate\Contracts\Auth\UserProviderのインスタンスを返す…
return new RiakUserProvider($app['riak.connection']);
});
}
/**
* コンテナに結合を登録
*
* @return void
*/
public function register()
{
//
}
}
extend
メソッドでドライバーを登録したら、config.auth.php
設定ファイルで新しいドライバーに切り替えます。
Userプロバイダー契約
Illuminate\Contracts\Auth\UserProvider
は、MySQLやRiakなどのような持続性のストレージシステムに対するIlluminate\Contracts\Auth\Authenticatable
の実装を取得することだけに責任を持っています。これらの2つのインターフェイスはユーザーデータがどのように保存されているか、それを表すのがどんなタイプのクラスなのかに関わらず、認証メカニズムを機能し続けるために役立っています。
Illuminate\Contracts\Auth\UserProvider
契約を見てみましょう。
<?php
namespace Illuminate\Contracts\Auth;
interface UserProvider {
public function retrieveById($identifier);
public function retrieveByToken($identifier, $token);
public function updateRememberToken(Authenticatable $user, $token);
public function retrieveByCredentials(array $credentials);
public function validateCredentials(Authenticatable $user, array $credentials);
}
retrieveById
関数は通常MySQLデータベースの自動増分IDのようなユーザーを表すキーを受け付けます。IDにマッチするAuthenticatable
実装が取得され、返されます。
retrieveByToken
関数は一意の$identifier
とremember_token
フィールドに保存されている"remember
me"
$token
からユーザーを取得します。前のメソッドと同じく、Authenticatable
実装が返されます。
updateRememberToken
メソッドは$user
のremember_token
フィールドを新しい$token
で更新します。新しいトークンは真新しいものでも、「Remember
me」ログインに成功した時の値でも、ログアウト時のnull値でも受け付けます。
retrieveByCredentials
メソッドはアプリケーションにログイン時にAuth::attempt
メソッドに指定するのと同じく、ユーザー認証情報の配列を引数に取ります。メソッドは認証情報に一致するユーザーを裏の持続ストレージから「クエリー」する必要があります。典型的な使用方法の場合このメソッドは$credentials['username']
の"where"条件でクエリーを実行するでしょう。メソッドはUserInterface
の実装を返します。このメソッドはパスワードバリデーションや認証を行ってはいけません
validateCredentials
メソッドは指定された$user
とユーザーを認証するための$credentials
とを比較します。たとえばこのメソッドは$user->getAuthPassword()
文字列と$credentials['password']
をHash::make
した値を比較します。このメソッドはユーザーの認証情報のバリデーションだけを行い、論理値を返します。
認証契約
これでUserProvider
の各メソッドが明らかになりました。続いてAuthenticatable
契約を見てみましょう。プロバイダーはretrieveById
とretrieveByCredentials
メソッドでこのインターフェイスの実装を返していたことを思い出してください。
<?php
namespace Illuminate\Contracts\Auth;
interface Authenticatable {
public function getAuthIdentifier();
public function getAuthPassword();
public function getRememberToken();
public function setRememberToken($value);
public function getRememberTokenName();
}
このインターフェイスはシンプルです。getAuthIdentifier
メソッドはユーザーの主キーを返します。MySQLを裏で使用している場合、これは自動増分される主キーでしょう。getAuthPassword
はユーザーのハッシュ済みのパスワードを返します。このインターフェイスはどのORMや抽象ストレージ層を使用しているかに関わらず、どんなUserクラスに対しても認証システムが動作するようにしてくれています。デフォルトでLaravelは、このインターフェイスを実装してるapp
ディレクトリーの中のUser
クラスを持っています。ですから実装例としてこのクラスを調べてみてください。
イベント
Laravelは認証処理の過程で、様々なイベントを発行します。これらのイベントに対し、EventServiceProvider
でリスナーを登録できます。
/**
* アプリケーションに対するその他のイベントの登録
*
* @param \Illuminate\Contracts\Events\Dispatcher $events
* @return void
*/
public function boot(DispatcherContract $events)
{
parent::boot($events);
// 認証が試まれるたびに発行される
$events->listen('auth.attempt', function ($credentials, $remember, $login) {
//
});
// ログインに成功した時に発行される
$events->listen('auth.login', function ($user, $remember) {
//
});
// ログアウト時に発行される
$events->listen('auth.logout', function ($user) {
//
});
}