Laravel使ってみた (18) - Security(ユーザー認証) -
http://laravel.com/docs/security のドキュメント読み。なんだがユーザー認証的な所だけを書く。っていう事でフォーム認証な所をやってみる。パスワードリマインダー的な所は次回に書く。まとめて書くとわけわかめになるので
あとめんどくさいのでクラス作らずにroutes.phpにClosureでダラ書き
フォーム認証な辺りに関して
単純にルーティングフィルターでauthっていうのが提供されている。んまぁコード的には
Route::filter("auth", function() {
if (Auth::guest()) return Redirect::guest("login");
});
的な感じになっててログインしてなきゃログインフォームなページにリダイレクトな感じな事しているっぽい訳で。でログインを行わせるには
- Auth::attemptで認証処理を行う
- Auth::login(User)で認証処理を行う
とか。Auth::loginUsingIdっていうAPIがあって、引数にユーザーのID(int?)辺りを指定する事でもログイン出来るらしいけど、これはこれでどうなのっていう所なので特に使わない
まぁという感じな概要になってる訳で。とにかくやってみる
Authを使う為の使用準備
まぁUserっていうモデルが必要。まぁデフォルトで入ってる気がするけどマイグレーションが無いっていう訳で
- usernameカラムを持つ
- passwordカラムを持つ
- emailカラムを持つ
- created_atカラムを持つ
- updated_atカラムを持つ
なテーブルを作る。んまぁセットアップな感じはこんなもんかと。
ルーティングを定義
// /dashboardと/logoutはログインしてないとダメって事でフィルターを付ける
Route::group(["before" => "auth"], function() {
Route::resource("/dashboard", "DashboardController");
Route::get("/logout", function() {
// ログアウト処理
Auth::logout();
return Redirect::to("/login");
});
});
// 認証フォームなビューをレンダリング
Route::get("/login", function() {
return View::make("login");
});
// 認証処理
Route::post(
"/login",
array(
"before" => "csrf",
function() {
$username = Input::get("username", null);
$password = Input::get("password", null);
$credentials = array(
"username" => $username,
"password" => $password
);
// ログイン処理。多分、attemptメソッドの返り値はbool
Auth::attempt($credentials);
return Redirect::to("/dashboard");
}
)
);
っていう感じで。ちなみに
- Auth::attemptを使うとauth.attemptなイベントが発生
- ログインされたら?auth.loginなイベントが発生
っていうのがあるのでEvent::listenとかで拾う事が出来る模様
余談: authフィルターのコントローラーテストをする
何やら普通にコントローラーテストとかで
$this->call("GET", "/dashboard");
とかやってもフィルターが作用しないっぽい? Route::enableFiltersを明示的に呼ぶ必要性があるっぽい事をとあるフォーラムに書かれてたので
<?php
class DashboardControllerTest extends TestCase {
public function setUp() {
parent::setUp();
Route::enableFilters();
}
public function test_authed_index() {
Auth::once([ "username" => "demo", "password" => "demo" ]);
$this->call("GET", "/dashboard");
$this->assertResponseStatus(200);
}
}
上記のAuth::onceな所をコメントすると認証状態が保護されてない為にレスポンスステータスが302を返すのでこのテストはずっこける
っていう感じかなと