速習Larave3(その9)、ユーザー認証No.2
Tags : Laravel3
ユーザー認証を取り込み、いよいよ後半に入り、認証のためのコーディングに取り掛かります。
まずはルートを定義しましょう。以下のコードを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/views
にauth
フォルダーを作成してください。その中に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
だけにしています。あまり親切にしてしまうと悪い人にパスワードの構成のヒントを教えることになるからです。まあ、登録でバレちゃうんですけどね。