



セッションの認証管理をサポートする
このモジュールは、そのままでは使えない。実際に認証を行なうメソッド_login()は、デフォルトの状態ではユーザ名"guest"、パスワード"guest"しか認証しないようになっている。実際的な認証を行うためには、派生クラスを生成して_login()をオーバーライトする。
認証するユーザ名とパスワードは、デフォルトではCGIオブジェクトの$cgi->param('log_username')と$cgi->param('log_password')に格納されている事が仮定される。log_usernameフィールドとlog_passwordフィールドにユーザ名とパスワードを入力させるようなフォームを作成して使うのが最も簡単である。
使い方:
package MyAuth;
use base qw(CGI::Session::Auth);
sub _login {
my $self = shift;
my ($username,$password) = @_;
if (($username eq 'admin') && ($password eq 'password')) {
$self->_info("User '$username' logged in");
$self->{userid} = 'admin';
$self->_loadProfile($self->{userid});
return 1;
}
0;
}
package main;
use CGI;
use CGI::Session;
use MyAuth;
// CGIオブジェクトを生成する。
my $cgi = new CGI;
// CGI::Sessionオブジェクトを生成する。
my $session = CGI::Session->load($cgi);
if ($session->is_expired) {
// セッション期限切れなので、新しいセッションを作って再認証の要求をする
// 注:cookieの期限がセッション期限以下の場合は、ここには来ない。
}
elsif ($session->is_empty) {
$session = new CGI::Session($cgi);
}
// CGI::Session::Authオブジェクトを生成する。
my $auth = new MyAuth({CGI => $cgi, Session => $session }):
// 未認証の場合は、log_usernameとlog_passwordで認証する
// 同じセッション内で認証済みであれば、インスタンスを認証済み状態にする
$auth->authenticate();
if ($auth->loggedIn) {
// ログイン成功
// (同じセッション内で認証済みの場合でも)
// authenticate() を実行しないと、このメソッドは正しい結果を返さないので注意。
}
else {
// ログイン失敗
}
その他使いそうなメソッド:
my $session = new CGI::Session::Auth({CGI => $cgi, Session => $session, IPAuth => 1});
認証メソッドとして_login()ではなく、_ipAuth()を使用する。
このメソッドは、ソースを読んでも適当な見本が書かれていないが、恐らく引数としてIPアドレスが渡されてくるものと思われる。_login()と同様、デフォルトでは何もしないので、派生クラスでオーバーライトしなければならない。
my $session = new CGI::Session::Auth({CGI => $cgi, Session => $session, LoginVarPrefix => $prefix});
例えば、$prefixに'my'が格納されていたら、ユーザ名・パスワードをチェックするCGIパラメタがlog_username,log_passwordからmy_logname,my_passwordに変わる。
my $session = new CGI::Session::Auth({CGI => $cgi, Session => $session, Log => 1});
Log::Log4perlを使用してログを出力する。認証ログをsyslogに出力する事もできそう。
$auth->_loadProfile($username);
_login()の中から呼び出して、$auth->{$key}にユーザプロファイルを設定する。キーは任意の文字列を使用可能。デフォルトでは何もしないので、派生クラスでオーバーライトする。
$auth->hasUsername($username);
$usernameが認証済みならtrueを返す。
$auth->logout();
認証を取り消して、ログアウト状態に戻す。
$auth->profile($key);
_loadProfileで設定されたユーザプロファイル$keyの値を取得する。