ユーザ認証のプログラムを考えてみました。
CPANでスタンドアローンのよさげな認証モジュール(PHPで言うAuth.php)を探してたのだが、一向に見当たらないので、しょうがないから自分で考えた。最近、「オブジェクト指向」というより「いかにモジュールを使って楽するか」ばかり考えてたから、こうやってルーチンを考えるのがなんだか面倒くさくてしょうがなかった。
一応探した中では、CGI::Session::Auth::DBIってモジュールが結構目的に近かったんだけど、いくらいじってみても全然動きが分からなかった。Googleで検索してみても、これに関する日本人の書いたエントリが見当たらないし。他にAuthen::Simple::DBIってモジュールも見つけたけど、そもそもこの作者、明らかにCPAN Authorになりたいが為にテキトーに作ったモジュールを上げたって感じ。それなら、よーしパパ、今作った認証の仕組みを上げてCPAN Authorになっちゃうぞ、って、俺も同じような人間になってどうする。
とまあとにかく、もちっと汎用的なDBを使った認証のモジュールがあってもいいな、とは思う。ひょっとしたら、まだ探し足りないのかもしれないけど。
んで、面倒くさいと言いつつその作ってみた認証プログラムがこちら。細かいところはぼかしてます。あと、大人気のClass::DBIを尻目に誰も知らないようなDBIx::Abstractを使ってたりw
(追記 2/27)
昨日書いたのはあまりにもな出来だったんで、書き直しました。一応、ウチのはこれで動かしてます。
#!/usr/bin/perl -w use strict; use warnings; use CGI; use CGI::Session; use DBIx::Abstract; my $db = DBIx::Abstract->connect({ driver=>'ドライバ名', host=>'ホスト名', dbname=>'DB名', user=>'DBのユーザ名', pass=>'DBのパスワード', port=>'DBのポート', }); my $q = new CGI; if(!$q->cookie("test")){ CGI::Session->name("test"); my $session = new CGI::Session(undef, undef, {Directory=>'../session'}); $session->expire('+1w'); my $cookie = $q->cookie( -expires=>'+7d', -name=>'test', -value=> $session->id, ); print $q->header( #-type => 'text/html', #-charset => 'UTF-8', -cookie => $cookie, ); print $q->start_form('POST'); print "USERNAME:".$q->textfield(-name=>'username')."<br />"; print "PASSWORD:".$q->password_field(-name=>'password')."<br />"; print $q->submit('ログイン'), $q->end_form(), $q->end_html; }else{ CGI::Session->name("test"); my $session = CGI::Session->new(undef, $q->cookie('test'), {Directory=>'../session'}); my $user; if($q->param('username')&&$q->param('password')){ my $uname = $q->param('username'); my $pass = $q->param('password'); my $u_where = { 'ユーザ名カラム' => $uname, 'パスワードカラム' => $pass }; $db->select('*', 'DBのテーブル', $u_where); $user = $db->fetchrow_hashref; $session->param("login",'yes') if $user; }elsif($session->param("login")){ $user = 1; } if($user){ $session->expire('+1w'); my $cookie = $q->cookie( -expires=>'+7d', -name=>'test', -value=>$session->id, ); print $q->header( -type => 'text/html', -charset => 'UTF-8', -cookie=> $cookie, ); ## ##ログイン成功時のプログラム ## }else{ CGI::Session->name("test"); my $session = new CGI::Session(undef, undef, {Directory=>'../session'}); $session->close; $session->delete(); my $cookie = $q->cookie( -expires=>'-1m', -name=>'test', -value=> $session->id, ); print $q->header( -type => 'text/html', -charset => 'UTF-8', -cookie => $cookie, ); ## ##ログイン失敗時のプログラム ## } } exit(0);