-#!/usr/bin/perl
-
package Catalyst::Plugin::Authentication;
use base qw/Class::Accessor::Fast Class::Data::Inheritable/;
# constant->import(have_want => eval { require Want });
#}
-our $VERSION = "0.09999_01";
+our $VERSION = "0.10002";
sub set_authenticated {
my ( $c, $user, $realmname ) = @_;
$c->NEXT::set_authenticated($user, $realmname);
}
-sub _should_save_user_in_session {
- my ( $c, $user ) = @_;
-
- $c->_auth_sessions_supported
- and $c->config->{authentication}{use_session}
- and $user->supports("session");
-}
-
-sub _should_load_user_from_session {
- my ( $c, $user ) = @_;
-
- $c->_auth_sessions_supported
- and $c->config->{authentication}{use_session}
- and $c->session_is_valid;
-}
-
-sub _auth_sessions_supported {
- my $c = shift;
- $c->isa("Catalyst::Plugin::Session");
-}
-
sub user {
my $c = shift;
sub _user_in_session {
my $c = shift;
- return unless $c->_should_load_user_from_session;
+ return unless
+ $c->isa("Catalyst::Plugin::Session")
+ and $c->config->{authentication}{use_session}
+ and $c->session_is_valid;
return $c->session->{__user};
}
# this sets the realm the user originated in.
$user->auth_realm($realmname);
+
return $user;
}
sub _authentication_initialize {
my $app = shift;
- if ($app->_auth_realms) { return };
-
+ ## let's avoid recreating / configuring everything if we have already done it, eh?
+ if ($app->can('_auth_realms')) { return };
+ ## make classdata where it is used.
+ $app->mk_classdata( '_auth_realms' => {});
my $cfg = $app->config->{'authentication'} ||= {};
$cfg->{use_session} = 1;
-
- ## make classdata where it is used.
- $app->mk_classdata( _auth_realms => {});
-
-
if (exists($cfg->{'realms'})) {
foreach my $realm (keys %{$cfg->{'realms'}}) {
$app->setup_auth_realm($realm, $cfg->{'realms'}{$realm});
}
} else {
- ## BACKWARDS COMPATIBILITY - if realm is not defined - then we are probably dealing
+ ## BACKWARDS COMPATIBILITY - if realms is not defined - then we are probably dealing
## with an old-school config. The only caveat here is that we must add a classname
+ ## also - we have to treat {store} as {stores}{default} - because
+ ## while it is not a clear as a valid config in the docs, it
+ ## is functional with the old api. Whee!
+ if (exists($cfg->{'store'}) && !exists($cfg->{'stores'}{'default'})) {
+ $cfg->{'stores'}{'default'} = $cfg->{'store'};
+ }
+
foreach my $storename (keys %{$cfg->{'stores'}}) {
my $realmcfg = {
- store => $cfg->{'stores'}{$storename},
+ store => { class => $cfg->{'stores'}{$storename} },
};
$app->setup_auth_realm($storename, $realmcfg);
}
sub setup_auth_realm {
my ($app, $realmname, $config) = @_;
- $app->log->debug("Setting up $realmname");
+ $app->log->debug("Setting up auth realm $realmname") if $app->debug;
if (!exists($config->{'store'}{'class'})) {
Carp::croak "Couldn't setup the authentication realm named '$realmname', no class defined";
}
# a little niceness - since most systems seem to use the password credential class,
# if no credential class is specified we use password.
- $config->{credential}{class} ||= "Catalyst::Plugin::Authentication::Credential::Password";
+ $config->{credential}{class} ||= '+Catalyst::Plugin::Authentication::Credential::Password';
my $credentialclass = $config->{'credential'}{'class'};
};
}
- $app->auth_realms->{$realmname}{'store'} = $storeclass->new($config->{'store'}, $app);
- $app->auth_realms->{$realmname}{'credential'} = $credentialclass->new($config->{'credential'}, $app);
+ ## a little cruft to stay compatible with some poorly written stores / credentials
+ ## we'll remove this soon.
+ if ($storeclass->can('new')) {
+ $app->auth_realms->{$realmname}{'store'} = $storeclass->new($config->{'store'}, $app);
+ } else {
+ $app->log->error("THIS IS DEPRECATED: $storeclass has no new() method - Attempting to use uninstantiated");
+ $app->auth_realms->{$realmname}{'store'} = $storeclass;
+ }
+ if ($credentialclass->can('new')) {
+ $app->auth_realms->{$realmname}{'credential'} = $credentialclass->new($config->{'credential'}, $app);
+ } else {
+ $app->log->error("THIS IS DEPRECATED: $credentialclass has no new() method - Attempting to use uninstantiated");
+ $app->auth_realms->{$realmname}{'credential'} = $credentialclass;
+ }
}
sub auth_realms {
if ( my $new = shift ) {
$self->auth_realms->{'default'}{'store'} = $new;
- my $storeclass = ref($new);
+
+ my $storeclass;
+ if (ref($new)) {
+ $storeclass = ref($new);
+ } else {
+ $storeclass = $new;
+ }
# BACKWARDS COMPATIBILITY - if the store class does not define find_user, we define it in terms
# of get_user and add it to the class. this is because the auth routines use find_user,