読者です 読者をやめる 読者になる 読者になる

localdisk

PHP とか Java とか Web とか好きなことを書きます。

Laravel のログインパッケージ Confideの解説(実践編)

これは Laravel Advent Calendar 9日目の記事です。

先日に続き @localdisk が担当させて頂きます。
内容としては先日紹介した Confide の紹介、本日は実践編です。
導入については http://localdisk.hatenablog.com/ に書いてありますのでよかったら読んでみて下さい。

さて、Confide をどのように使用するかは、昨日生成した UserController が参考になります。

まずは主な機能をリストにしてみましょう。

  • ユーザー登録
    • ユーザー確認(登録後メールが来るアレ)
  • ログイン
  • ログアウト
  • パスワードを忘れた
    • パスワードのリセット

と一通り揃っています。それでは1つずつ解説していましょう。

ユーザー登録

ここは簡単ですね。 UserController#store を参照してください。
Validation がかかれていませんが、Ardent が行っています。そう、Model で Validation してます。
Ardent に関しては記事にしましたので、よかったら読んでみてください。
閑話休題。Validation の内容については ConfideUser クラスを参照してみてください。

ユーザーの登録は Model を登録すれば終わりです。

<?php
    $user = new User;
    $user->username = Input::get('username');
    $user->email    = Input::get('email');
    $user->password = Input::get('password');
    $user->password_confirmation = Input::get('password_confirmation');
    $user->save();

これだけです。あとは Confide が before_save の中で認証コードを作成しています。
ついでに password_confirmation がセットされていれば unset してます。

なのでこんな書き方もありです。

<?php
$user = User::create(Input::all());

もしくは

<?php
$user = User::create(Input::only(['username', 'email', 'password', 'password_confirmation']));

ユーザー確認

次はユーザー確認ですね。大体はメールで行うと思います。メールに関しては、マニュアルに任せておいて(めんどくさくなってきた…)、ここではメール本文に載せる
URLだけ、記しておきます。

<?php
<a href='{{{ URL::to("user/confirm/{$user->confirmation_code}") }}}'>
    {{{ URL::to("user/confirm/{$user->confirmation_code}") }}}
</a>

ログイン

UserConroller#do_login の内容がそのまま使えます。

<?php
$input = array(
    'email'    => Input::get('email'), // May be the username too
    'username' => Input::get('email'), // so we have to pass both
    'password' => Input::get('password'),
    'remember' => Input::get 'remember'),
);
if ( Confide::logAttempt( $input, Config::get('confide::signup_confirm') ) ) 
    return Redirect::intended('/'); // change it to '/admin', '/dashboard' or something
}

上記の例は email でログインさせようとしています。 username/email どちらも OK とするなら username のところは Input::get('username') してあげてください。
もう一つのポイントが Redirect::intended これはログイン前に遷移しようとした URL にリダイレクトします。
内部的には auth フィルターに引っかかった時の URL をセッションに保存しておいて、ログイン後に使用することになってます。こういうところ、気が効いてますね。

ログアウト

<?php
Confide::logout();

以上。

パスワード忘れた

<?php
Confide::forgotPassword(Input::get('email'))

email を引数にして Confide#forgotPassword を呼んであげましょう。
これだけでパスワードリセットのメールが送信されます。
この部分、個人的には自分でハンドリングしたかったりするので、ちょっと変更したりします。
メールを送信しているのは ConfideUser#forgotPassword なので、変更したい場合はこのメソッドをオーバーライドするとよいです。
メールの中身は vendor/zizaco/confide/src/views/emails/passwordreset.blade.php にあります。

パスワードリセット

<?php
Confide::resetPassword(Input::only(['token', 'password', 'password_confirmation']))

これで新しい、パスワードを設定できます。

まとめ

いかがでしょうか。長々と説明しましたが、全体的にかなりお手軽なライブラリだと思います。他にも紹介しきれなかったメソッドがありますので興味がわいたらソースを読んでみてください。
考え方を身につけたいという方は自力で実装した 川瀬さんのエントリがありますので参考にしてみてはいかがでしょうか。
ちなみに、ロールベースのパーミッション機能を持つ Entrust というパッケージもありますので、これを使用するとだいたいの Web アプリケーションに求められる認証/認可の機能は満たせると思います。

僕は使ったことないですが、MongoDB を使用した Confide Mongo パッケージもあります。使ったことある人がいたら使用感とか聞きたいです。

明日は morisuke さんです。お楽しみに!