前回は、Sentry2でログインする方法を調べましたので、今回は、Sentry2 用のログインフィルターの作成及び適用について調べてみたいと思います。
デフォルトのフィルター
その前にまず、Laravel4のデフォルトのフィルターを見てみましょう。
laravel/app/filters.php
<?php App::before(function($request){ // }); App::after(function($request, $response){ // }); Route::filter('auth', function(){ if (Auth::guest()) return Redirect::guest('login'); }); Route::filter('auth.basic', function(){ return Auth::basic(); }); Route::filter('guest', function(){ if (Auth::check()) return Redirect::to('/'); }); Route::filter('csrf', function(){ if (Session::token() != Input::get('_token')){ throw new Illuminate\Session\TokenMismatchException; } });
- 2-7行目:アプリケーションの開始前と終了後に動作させるイベントを定義することが出来ます。ここには、プロジェクト全体で適用するフィルターを作成します。
- 8-10行目:Laravel標準添付の認証フィルターです。Auth::attempt()で認証した場合、適用されます。今回はこれは使用しません。
- 11-13行目:ベーシック認証を使用するためのフィルターです。
- 14-16行目:guestフィルターです。authフィルターと逆の働きをしています。authフィルターがログインしていなければ、loginページへリダイレクトしているのに対し、guestフィルターは、ログインしていれば、トップページへ移動するように記述しています。
- 17-20行目:CSRF対策のためのフィルターです。セッションのトークンとフォームから送信されてきたトークンが異なった場合にトークンエラー(TokenMismaatchExcrption)がスローされる(投げかけられる)ように作られていますので、例外処理用のロジックを作成した方が無難だと思います。
Sentry用のフィルター
それでは、filters.phpにSentry2用のフィルターを追加します。
//Sentryフィルター Route::filter('sentry', function(){ if ( ! Sentry::check()) return Redirect::to('login'); });
- 2行目:’sentry’名(任意)でフィルターを作成します。
- 3行目:Sentry::checkメソッドは、Sentry2を使用して認証している事を確認するためのメソッドですので、ここでは、もし認証されていなければ、Loginコントローラのindex.phpへ移動するように指定しています。
ルーターでフィルターの適用
フィルターを適用するには、ルーター(routes.php)にフィルターを記述する方法と、コントローラにフィルターを記述する方法があります。
まず、先にルーターにフィルターを適用する方法を調べてみます。Route::getメソッドの、第2引数の、’before’にsentryフィルターを指定します。
laravel/app/routes.php
Route::get('/', array('before'=>'sentry',function() { return View::make('hello'); }));
コントローラにフィルターの適用
次に、コントローラ内にフィルターを適用する方法を調べてみます。コントローラ内にフィルターを適用するには、コンストラクターに記述します。
//コンストラクター public function __construct(){ $this->beforeFilter('sentry'); $this->beforeFilter('csrf',array('on'=>'post')); }
- 3行目:beroreFilterメソッドの第1引数で適用するフィルターを指定します。第2引数は、オプションで’only’や’except’プロパティを指定することが出来ます。
//例:getIndexのみにフィルターを適用する
$this->beforeFilter(‘sentry’,’only’=>getIndex()); - 4行目:CSRFフィルターの適用例です。POST送信時のみに適用されます。