Laravel使ってみた (18) - Security(ユーザー認証) -

2013-07-28T00:00:00+00:00 Laravel PHP

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を返すのでこのテストはずっこける

っていう感じかなと

Laravel使ってみた (19) - Security(パスワードリマインダーとその他) - Laravel使ってみた (17) - Queue -