環境
- PHP 7.3
- Laravel 5.8
はじめに
Laravel では標準で認証の機能がついている。デフォルトではメールアドレスとパスワードを利用してログインする。フォームにメールアドレスとパスワードを入力して送信すると、 LoginController::login
メソッドにリクエストが送られる。
LoginController
の中では use AuthenticatesUsers
されており、この AuthenticatesUsers
トレイとの login
メソッドが呼ばれる仕組みになっている。
この login
メソッドの中ではログイン試行回数のカウントや、Userテーブルとの照らし合わせなどさまざまなことをやっているが、このログイン周りの機能を独自に修正したい場合には、中身を知っておく必要があるので、中身を細かく見ていってみる。
AuthenticatesUsers::login の中でやっていること
framework/AuthenticatesUsers.php at 5.8 · laravel/framework · GitHub
以下のことをやっている
$this->validateLogin($request);
- ログイン試行回数チェック(
$this->hasTooManyLoginAttempts
あたり) $this->attemptLogin($request)
$this->incrementLoginAttempts($request);
return $this->sendFailedLoginResponse($request);
validateLogin
これの中身は単に $request->validate
で、ログインに必要なパラメータが送られてきているかどうかを確かめているだけである。
hasTooManyLoginAttempts まわり
<?php if (method_exists($this, 'hasTooManyLoginAttempts') && $this->hasTooManyLoginAttempts($request)) { $this->fireLockoutEvent($request); return $this->sendLockoutResponse($request); }
この一連の処理は、ログイン試行回数超過によりアカウントをロックする処理が書かれている。
hasTooManyLoginAttempts
メソッドが定義されていると、このメソッドが呼ばれる。このメソッドでログイン回数が超過されていると判定された場合は fireLockoutEvent
でアカウントロックを発動させ、 sendLockoutResponse
を返す。
hasTooManyLoginAttempts
と fireLocktoutEvent
は ThrottlesLogins
というトレイトに実装されており、デフォルトだとこれが使われる。
ThrottlesLogins::hasTooManyLoginAttempts
RateLimiter
framework/RateLimiter.php at 5.8 · laravel/framework · GitHub
Cache(Chacheの中身は.envの設定次第)を利用し、デフォルトでは1分間に5回試行があるとアカウントが1分ロックされるようになっている。
この設定は $this->maxAttempts
と $this->decayMinutes
をコントローラーなどに設定すると変更でき、 decayMinutes
分に maxAttempts
回 ログインに失敗すると decayMinutes
分ログインがロックされるという仕組みになっている。
attemptLogin
つづいて $this->attemptLogin
でログインしようと試みる。ログインに成功すると sendLoginResponse
される。
<?php if ($this->attemptLogin($request)) { return $this->sendLoginResponse($request); }
attemptLogin
の中は以下のようになっている。
<?php protected function attemptLogin(Request $request) { return $this->guard()->attempt( $this->credentials($request), $request->filled('remember') ); }
そして guard()
の中身はこうなっている
<?php protected function guard() { return Auth::guard(); }
Auth::guard
メソッドは auth.php
の guards
に設定と連携しており、例えば
return Auth::guard('api');
とすると、
<?php 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'token', 'provider' => 'users', 'hash' => false, ], ],
のAPIが使われる。
引数に何も指定していない場合( Auth::guard()
)は、 auth.php
に defaults
という設定があると思うので、それが使われる。
<?php 'defaults' => [ 'guard' => 'web', 'passwords' => 'users', ],
この場合 guards
の web
がデフォルトで 利用される。(auth.php
の設定についてはここでは詳しく説明しません)
ここでログインが成功した場合は sendLoginResponse
でログイン成功レスポンスが送られる。
sendLoginResponse
の中では、セッションが作成され、ログイン失敗回数がリセットされ、ログイン成功のレスポンスが返される。
それ以降の処理
ログインに成功したときは上記で処理が終わるので、それ以降は、ログイン失敗時の処理である。
ログイン失敗時は incrementLoginAttempts
でログイン失敗回数をカウントし、 sendFailedLoginResponse
でログイン失敗レスポンスが送られる。
- 作者:掌田津耶乃
- 発売日: 2017/09/16
- メディア: 単行本