Catalyst::Manual::Tutorial::Authenticationと同じことをTripletailでやってみたよ
これ
Catalyst::Manual::Tutorial::Basicsと同じことをTripletailを使ってやったのでその感想とか - libnitsuji.so
の続きです。こっそりと続いています。
今回は認証です。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
http://takatoshi.dyndns.org/misc/myapp/auth/myapp.cgi
Tripletail
http://takatoshi.dyndns.org/misc/tlapp/auth/login.cgi
Tripletialの方はデバッグウィンドウが開くと思います。
ソース
Catalyst
http://svn.takatoshi.dyndns.org/public/misc/MyApp/tags/authentication/
Tripletail
http://svn.takatoshi.dyndns.org/public/misc/TLApp/tags/authentication/
感想
思ったのは、Catalystみたいにモジュール名を書けばloginだとかlogoutだとかuser_existsだとか使えるとラクができていいねってことでした。
ユーザー名、パスワード以外の認証が必要でも使用するモジュールを変えればいいだけのようですし。
そういうのがDRYっていうのかなーとか思いました。
でもそこはTripletail自体のテリトリーではないと思うので、Tripletail依存?な認証モジュールとかがあるといいのかもしれません。よくわかんないけど。