ユーザ認証のプログラムを考えてみました。

 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);