Catalystでユーザー認証を

◆Catalyst で Authentication Namelessを参考にさせてもらって、さっくり実装してみた。
お手軽にできたけど、これ、どうやってセッション情報保持してるんだ?
(仕組みを理解してなくてもできちゃうのがフレームワークのすごさか(=w=;)

ちなみにこんな感じ。
以下をRoot.pmに仕込んで、テンプレート側でログイン状態を見て表示切替。

# ユーザーログイン
sub login : Global {
       my ( $self, $c ) = @_;

       if ( my $username = $c->req->param("username")
                and my $password = $c->req->param("password") ){
               if ( $c->login( $username, $password ) ){
#                       $c->res->body( "hello " . $c->user->namename );
                       $c->stash->{system_message} = 'login success!';
                       $c->session->{username} = $username;
               }
               else{
                       # login incorrect
                       $c->stash->{system_message} = 'login incorrect!';
               }
       }
       else{
               # invalid form input
               $c->stash->{system_message} = 'invalid form input!';
       }

       $c->stash->{'subtitle'} = 'トップページ';
       $c->stash->{'template'} = 'index.tt';
       $c->res->redirect('/');
       return 0;
}

# ユーザーログアウト
sub logout : Global {
       my ( $self, $c ) = @_;

       undef $c->session->{username};

       $c->stash->{'subtitle'} = 'トップページ';
       $c->stash->{'template'} = 'index.tt';
       $c->res->redirect('/');
       return 0;
}

以下、テンプレート側

[% IF c.session.username == "" %]
<form action="/login" method="POST">
USER:<input type="text" name="username"><br>
PASS:<input type="password" name="password"> <input type="submit" value="ログインする">
</form>
[% ELSE %]
<form action="/logout" method="POST">
USER:[% c.session.username %] <input type="submit" value="ログアウトする">
</form>
[% END %]

あと、プラグインの設定がこんな感じ。Apphoge.pmに仕込む。

use Catalyst qw/-Debug
                               ConfigLoader
                               Static::Simple
                               FormValidator
                               Authentication
                               Authentication::Credential::Password
                               Authentication::Store::DBIC
                               Authorization::Roles
                               Session
                               Session::State::Cookie
                               Session::Store::File
                               /;
__PACKAGE__->config(    name => 'troublecode',
                                               session => {
                                                       expires => 60 * 60 * 24,
                                                       rewrite => 0,
                                                       storage => '/tmp/session',
                                               },
                                               authentication => {
                                                       dbic => {
                                                               user_class      => 'troublecode::Model::CDBI::Users',
                                                               user_field              => 'username',
                                                               password_field  => 'password',
                                                       },
                                               }
);