速習Larave3(その9)、ユーザー認証No.2

タグ: Laravel3  

ユーザー認証を取り込み、いよいよ後半に入り、認証のためのコーディングに取り掛かります。

前記事:速習Larave3(その9)、ユーザー認証No.1

まずはルートを定義しましょう。以下のコードをroutes.phpに追加してください。

// ログイン
Route::get('/login', array( 'as' => 'login', 'uses' => 'auth@login' ));
Route::post('/login', array( 'as' => 'login', 'before' => 'csrf', 'uses' => 'auth@login' ));

// ログアウト
Route::get('/logout', array( 'as' => 'logout', 'uses' => 'auth@logout' ));

もう、理解できますよね。新しいことはやっていません。今までと同じ設定を行なっているだけです。

続いてログインフォームを作成します。application/viewsauthフォルダーを作成してください。その中にlogin.blade.phpを作成します。

@layout('template')

@section('title')
    ログイン
@endsection

@section('content')
    {{ Form::open() }}
    <div>
        {{ Form::label('username', 'ユーザー名') }}<br>
        {{ Form::text('username', Input::old('username', '')) }}
        @if ($errors->has('username'))
             <p type="color: red">{{ $errors->first('username') }}</p>
        @endif
    </div>
    <div>
        {{ Form::label('password', 'パスワード') }}<br>
        {{ Form::password('password') }}
        @if ($errors->has('password'))
              <p type="color: red">{{ $errors->first('password') }}</p>
        @endif
    </div>
    <div>
        {{ Form::submit('ログイン') }}
    </div>
    {{ Form::token() }}
    {{ Form::close() }}
@endsection

ここで新しいのは、Formクラスでパスワード領域を生成していることです。password()には内容を表示するデフォルトを指定できません。できるだけパスワード盗聴の機会を減らすため、サーバーからは送信しないというグッド(バッド?)プラクティスに基づいています。

ルートの定義を読まれて既に気づかれたでしょうが、authコントローラーでログイン・ログアウトは処理します。auth.phpを作成してください。

<?php

class Auth_Controller extends Base_Controller
{
    public $restful = true;

    public function __construct()
    {
        parent::__construct();
    }

    public function get_login()
    {
        return view('auth.login');
    }

    public function post_login()
    {
        $rules = array(
            'username' => 'required',
            'password' => 'required',
        );

        $inputs = Input::only(array(
                'username', 'password'
            ));

        $val = Validator::make($inputs, $rules);

        if ( $val->passes() )
        {
            if ( Auth::attempt($inputs) )
            {
                // 認証成功
                return Redirect::home()
                        ->with('message', 'ログインしました。');
            }
            else
            {
                // 認証失敗
                return Redirect::back()
                        ->with_input()
                        ->with('warning', 'ユーザー名とパスワードが一致しません');
            }
        }
        else
        {
            return Redirect::back()
                    ->with_input()
                    ->with_errors($val);
        }
    }

    public function get_logout()
    {
        Auth::logout();

        return Redirect::back()
                ->with('message', 'ログアウトしました。');
    }
}

Laravel的に目新しいのは、Redirectクラスのback()を使用していることでしょう。これは直前のリクエストに戻るものです。便利です。しかし困ったことがあるんです。このメソッドはHTTPリファラの値に戻るのですが、IEのバージョンによってはこれを設定しないものがあるそうで、動作しないのです。

そのリスクがあることを覚えておいてください。古いIEなんか気にしなければ便利に使用できます。古いIEを使用しているユーザーも逃したくないかたは、使わないほうが懸命です。

あと、意図的にユーザー名とパスワードのバリデーションはrequiredだけにしています。あまり親切にしてしまうと悪い人にパスワードの構成のヒントを教えることになるからです。まあ、登録でバレちゃうんですけどね。