ユーザー認証の目的は、ユーザー本人であることを確認し、ユーザーのプライベートの情報を他に見られることを防ぐことです。
Laravelでは、アプリにおけるすべてのルートを設定するroutes.php
のファイルにおいて、ミドルウェアを利用して保護するページを指定します。
Route::get('/home', ['middleware' => 'auth', function () { return view('auth.home'); }]);
上の例では、/homeを保護するために、ミドルウェアのauth
を使用しています。auth
は、以下のKernel.php
で登録されているサービスです。
namespace App\Http; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel { protected $middleware = [ ... ]; protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, ]; }
そこでバインドされているクラスは、以下のAuthenticate.php
で定義されています。
namespace App\Http\Middleware; use Closure; use Illuminate\Contracts\Auth\Guard; class Authenticate { protected $auth; public function __construct(Guard $auth) { $this->auth = $auth; } public function handle($request, Closure $next) { if ($this->auth->guest()) { if ($request->ajax()) { return response('Unauthorized.', 401); } else { return redirect()->guest('auth/login'); } } return $next($request); } }
handle()
内での、$this->auth->guest()
は、ユーザーがゲスト、つまり認証されていないユーザーであるかどうかをチェックします。認証されていないなら、auth/login
にリダイレクトして、ログイン画面が表示されます。
routes.php
でのページ保護は、Route::group
で行うこともできます。例えば、以下のように複数のルートをまとめることができます。わかりやすいですね。
Route:: group(['prefix' => 'member', 'middleware' => 'auth'], function() { Route::get('index', 'MemberController@getIndex'); Route::get('password', 'MemberController@getPassword'); Route::post('password', MemberController@postPassword'); Route::get('profile', 'MemberController@getProfile'); Route::post('profile', 'MemberController@postProfile'); Route::get('logout', 'MemberController@getLogout'); });
さらに、認証の保護しないページにおいて、すでに認証されているならスキップしてリダイレクトさせることも可能です。
以下では、ログインや登録画面にアクセスしたときにすでにログインしているなら、/homeにリダイレクトされます。ミドルウェアにおいて、guest
が使用されていることに注意してください。このミドルウェアも先のKernel.php
で登録されています。
Route::group(['middleware' => 'guest'], function() { Route::get('login', 'LoginController@getLogin'); Route::post('login', 'LoginController@postLogin'); Route::get('signup', 'SignupController@getSignup'); Route::post('signup', 'SignupController@postSignup'); });
これらのミドルウェアは、routes.php
だけでなくコントローラの中でも実行できます。例えば、前回まで使用してきた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; class AuthController extends Controller { use AuthenticatesAndRegistersUsers, ThrottlesLogins; public function __construct() { $this->middleware('guest', ['except' => 'getLogout']); } ... }
guest
のミドルウェアをコンストラクタで使用することにより、ログアウト(getLogout
)以外のメソッド、つまり会員登録(getRegister
とpostRegister
)とログイン(getLogin
とpostLogin
)のメソッドにおいて、すでにログインしているなら/homeにリダイレクトします。