##
sub _login {
##
## check login credentials and load user profile
##
my $self = shift;
my ($username, $password) = @_;
# allow only the guest user, for real applications use a subclass
# if ( ($username eq 'guest') && ( $password eq 'guest' ) ) {
# $self->_info("User '$username' logged in");
# $self->{userid} = "guest";
# $self->_loadProfile($self->{userid});
# return 1;
# }
# load my Active Directory object
my $ad_handle = com::corp::ActiveDirectory->new('WIN');
if ( $ad_handle->login($username,$password) ) {
$self->_info("User '$username' logged in");
$self->{userid} = "guest";
# send user info via ->getUserInfo hash_ref
$self->_loadProfile($self->{userid}, $ad_handle->getUserInfo);
return 1;
}
return 0;
}
###########################################################
####
sub _ipAuth {
##
## authenticate by the visitors IP address
##
return 0;
}
###########################################################
sub _loadProfile {
##
## load the user profile for a given user id
##
my $self = shift;
my ($userid, $user_info) = @_;
# store some dummy values
$self->{userid} = $userid;
$self->{profile}{username} = 'guest';
$self->{profile}{user_info} = $user_info;
}
###########################################################
sub saveProfile {
##
## save probably modified user profile
##
}
###########################################################
sub isGroupMember {
##
## check if user is in given group
##
# abstract class w/o group functions, for real applications use a subclass
return 0;
}
###########################################################
###
### internal methods
###
###########################################################
###########################################################
sub _debug {
##
## log debug message
##
my $self = shift;
$self->{logger}->debug(@_) if $self->{logger};
}
###########################################################
sub _info {
##
## log info message
##
my $self = shift;
$self->{logger}->info(@_) if $self->{logger};
}
###########################################################
sub _session {
##
## get reference on CGI::Session object
##
my $self = shift;
return $self->{session};
}
###########################################################
sub _cgi {
##
## get reference on CGI object
##
my $self = shift;
return $self->{cgi};
}
###########################################################
sub _encpw {
##
## encrypt password
##
my ($self, $password) = @_;
return md5_hex($password);
}
###########################################################
sub _loggedIn {
##
## accessor to internal logged-in flag and session parameter
##
my $self = shift;
if (@_) {
# set internal flag
if ($self->{logged_in} = shift) {
# set session parameter
$self->_session->param("~logged-in", 1);
}
else {
# clear session parameter
$self->_session->clear(["~logged-in"]);
}
$self->_debug("(re)set logged_in: ", $self->{logged_in});
}
# return internal flag
return $self->{logged_in};
}
###########################################################
sub _url {
my $self = shift;
return $self->{url};
}
####
#!/usr/bin/perl -w
package testapp;
use base qw( CGI::Application );
use strict;
use CGI;
use CGI::Session;
use CGI::Session::Auth;
use CGI::Carp;
use Data::Dumper::HTML qw(dumper_html);
sub setup {
my $self = shift;
$self->start_mode('free');
$self->mode_param('cmd');
$self->run_modes(
'free' => 'showFreePage',
'secret' => 'showSecretPage',
'logout' => 'showLogoutPage',
);
# new session object
my $session = new CGI::Session(undef, $self->query, {Directory=>'/tmp'});
$self->param('_session' => $session);
# new authentication object
my $auth = new CGI::Session::Auth({
CGI => $self->query,
Session => $session
});
$self->param('_auth' => $auth);
$auth->authenticate();
# send session cookie
$self->header_props( -cookie => $auth->sessionCookie() );
}
sub _auth {
my $self = shift;
return $self->param('_auth');
}
sub showFreePage {
my $self = shift;
return <
Free page
Free accessible page
HTML
}
sub showSecretPage {
my $self = shift;
if (! $self->_auth->loggedIn) {
$self->showLoginPage;
}
else {
$self->showSecretData;
}
}
sub showLoginPage {
my $self = shift;
return <
Not logged in
You are not logged in
Please log in to see the secret page:
HTML
}
sub showSecretData {
my $self = shift;
my $var = dumper_html($self->_auth);
return <
Secret page
Secret data
$var
There's more than one way to do it!
HTML
}
sub showLogoutPage {
my $self = shift;
$self->_auth->logout();
return <
Logged out
You have logged out.
HTML
}
1;
package main;
my $app = new testapp;
$app->run();