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', }, } );