Catalyst::Manual::Tutorial::Authenticationと同じことをTripletailでやってみたよ

これ
Catalyst::Manual::Tutorial::Basicsと同じことをTripletailを使ってやったのでその感想とか - libnitsuji.so
の続きです。こっそりと続いています。

Catalyst::Manual::Tutorial::Authentication - Catalyst Tutorial - Part 4: Authentication - metacpan.org

今回は認証です。Catalystでは、

Authentication
Authentication::Store::DBIC
Authentication::Credential::Password

みたいなモジュールがいろいろとやってくれます。
セッション関係も、

Session
Session::Store::FastMmap
Session::State::Cookie

みたいなモジュールがいろいろやってくれます。
ログイン部分のコードはこんなので、

    if ( $username && $password ) {
        if ( $c->login($username, $password) ) {
            $c->response->redirect( $c->uri_for('/books/list') );
        }       
        else {  
            $c->stash->{error_msg} = 'Bad username or password.';
        }       
    }

ログイン済みかどうかは以下の戻り値で判断します。

$c->user_exists

一方のTripletialですが、セッション関係はTripletail::Sesisonが担っていてstartCgiで

$TL->startCgi(
    -main    => ?&main, 
    -Session => 'Session',
    -DB      => 'DB'
);

みたいにSessionの行を書くと有効になります(あとiniにも書かないとダメ)。そうすると

my $session = $TL->getSession();
$session->setValue(1);
my $value = $session->getValue();

とかできます。セットできる値は64bit符号無し整数のみ。
認証関係のコードは自分で書きます。ユーザー名とパスワードを受け取ってDBを見て、みたいなの。
で、こんな風になりました。
ログイン部分のコード。

    if ( $CGI->exists('username') && $CGI->exists('password') ) {
        my $user = MyApp::Service::UserService->new($TL->getDB(), {
            $CGI->getSlice(qw( username password ))
        });     
        if ( $user->login() ) {
            $session->setValue($user->get_id());
            my $url = $TL->newForm(cmd => 'list')->toLink('books.cgi');
            $TL->location($url);
        }       
        else {  
            my $error = { login => 'failed' };
            _disp_form_login($CGI, $error);
        }       

        return; 
    }

ログイン済みかどうか(セッションに値があるか?で判断)。

$session->getValue()

感想

思ったのは、Catalystみたいにモジュール名を書けばloginだとかlogoutだとかuser_existsだとか使えるとラクができていいねってことでした。
ユーザー名、パスワード以外の認証が必要でも使用するモジュールを変えればいいだけのようですし。
そういうのがDRYっていうのかなーとか思いました。
でもそこはTripletail自体のテリトリーではないと思うので、Tripletail依存?な認証モジュールとかがあるといいのかもしれません。よくわかんないけど。