package Gantry::Plugins::Shibboleth;
use strict;
use warnings;
use base 'Exporter';
our @EXPORT = qw(
auth_user_row
auth_user_groups
);
my %registered_callbacks;
#-----------------------------------------------------------
# $class->get_callbacks( $namespace )
#-----------------------------------------------------------
sub get_callbacks {
my ( $class, $namespace ) = @_;
return if ( $registered_callbacks{ $namespace }++ );
return (
{ phase => 'init', callback => \&initialize },
);
}
#-----------------------------------------------------------
# initialize
#-----------------------------------------------------------
sub initialize {
my ( $gobj ) = @_;
my $shib_attributes = $gobj->fish_config( 'shib_attributes' );
my $shib_group_attribute = $gobj->fish_config( 'shib_group_attribute' );
if ($shib_attributes) {
my $attributes;
my $obj;
# Get the list of shibboleth attributes this application cares about.
foreach my $attr ( split /,/o, $shib_attributes ) {
$attributes->{$attr} = $ENV{$attr};
}
# Create AuthUserObject containing the attributes and save it
# as the auth_user_row.
$gobj->auth_user_row( Gantry::Plugins::Shibboleth::AuthUserObject->new( $attributes ) );
}
# If a group attribute was specified then load the group(s) from that attribute.
if ( $shib_group_attribute ) {
my $shib_groups = $ENV{$shib_group_attribute};
my $groups;
foreach my $shib_group ( split /\;/o, $shib_groups ) {
$groups->{$shib_group} = 1;
}
$gobj->auth_user_groups( $groups );
}
}
#-------------------------------------------------
# $self->auth_user_row
#-------------------------------------------------
sub auth_user_row {
my ( $self, $p ) = ( shift, shift );
$$self{__AUTH_USER_ROW__} = $p if defined $p;
return( $$self{__AUTH_USER_ROW__} );
} # end auth_user_row
#-------------------------------------------------
# $self->auth_user_groups
#-------------------------------------------------
sub auth_user_groups {
my ( $self, $p ) = ( shift, shift );
$$self{__AUTH_USER_GROUPS__} = $p if defined $p;
return( $$self{__AUTH_USER_GROUPS__} );
} # end auth_user_groups
package Gantry::Plugins::Shibboleth::AuthUserObject;
sub new {
my( $class, $methods ) = @_;
my $self = {};
foreach my $method ( keys %$methods ) {
Sub::Install::reinstall_sub({
code => sub { return $methods->{$method} },
into => __PACKAGE__,
as => $method
});
}
bless( $self, $class );
return $self;
}
1;
=head1 NAME
Gantry::Plugins::Shibboleth - Plugin for shibboleth based authentication
=head1 SYNOPSIS
Plugin must be included in the Applications use statment.
use MyApp qw{
-Engine=CGI
-TemplateEngine=TT
-PluginNamespace=your_module_name
Shibboleth
};
Bigtop:
config {
engine MP20;
template_engine TT;
plugins Shibboleth;
...
There are two config options.
shib_attributes - Comma separated list of attributes that should be pulled from ENV.
shib_group_attribute - Shibboleth attribute to use as the group membership.
=head1 DESCRIPTION
This plugin mixes in auth_user_row and auth_user_groups methods that get their
values from shibboleth attributes. auth_user_row is an object with accessor
methods for each of the shibboleth attributes. auth_user_groups returns a hash
of groups that are taken from the attribute specified in the configuration file
as the shib_group_attribute.
=head1 CONFIGURATION
The plugin needs to be specified in your application use statement. The only
required config option is shib_attributes which is a comma separated list of
attributes you want to be loaded into the auth_user_row. You can also specify
a shib_group_attribute which will be used to populate the hash returned
by the auth_user_groups method.
=head1 CONFIG OPTIONS
shib_attributes - Comma separated list of attributes that should be pulled from ENV.
shib_group_attribute - Shibboleth attribute to use as the group membership.
=head1 METHODS
=over 4
=item get_callbacks
Registers the initialize function as a init level callback.
=item auth_user_row
This is mixed into the gantry object and can be called retrieve the user
row which is an object with accessor methods for each of the specified
shibboleth attributes.
=item auth_user_groups
This is mixed into the gantry object and can be called to retrieve the
defined groups for the authed user.
=item initialize
This method is called on each request to load the specified shibboleth attributes.
=back
=head1 SEE ALSO
Gantry
=head1 AUTHOR
John Weigel
=head1 COPYRIGHT AND LICENSE
Copyright (C) 2009 The World Company
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.6 or,
at your option, any later version of Perl 5 you may have available.
=cut