速習Larave3(その9)、ユーザー認証No.2
タグ: 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だけにしています。あまり親切にしてしまうと悪い人にパスワードの構成のヒントを教えることになるからです。まあ、登録でバレちゃうんですけどね。