NAME

Catalyst::Authentication::Store::FromSub::Hash - A storage class for Catalyst Authentication using one Catalyst Model class (hash returned)

SYNOPSIS

use Catalyst qw/Authentication/;

__PACKAGE__->config->{authentication} = 
                {  
                    default_realm => 'members',
                    realms => {
                        members => {
                            credential => {
                                class => 'Password',
                                password_field => 'password',
                                password_type => 'clear'
                            },
                            store => {
                                class => 'FromSub::Hash',
                                model_class => 'UserAuth',
        	                }
                        }
                	}
                };

# Log a user in:
sub login : Global {
    my ( $self, $c ) = @_;
    
    $c->authenticate({  
                      username => $c->req->params->username,
                      password => $c->req->params->password,
                      }))
}

package MyApp::Model::UserAuth; # map with model_class in config above
use base qw/Catalyst::Model/;
use strict;

sub auth {
    my ($self, $c, $userinfo) = @_;
    
    my $where;
    if (exists $userinfo->{user_id}) {
        $where = { user_id => $userinfo->{user_id} };
    } elsif (exists $userinfo->{username}) {
        $where = { username => $userinfo->{username} };
    } else { return; }

    
    # deal with cache
    # if (my $val = $c->cache->get($key) {
    #     return $val;
    # } else {
        my $user = $c->model('TestApp')->resultset('User')->search( $where )->first;
        $user = $user->{_column_data}; # hash
    #     $c->cache->set($key, $user);
    # }

    return $user;
}

DESCRIPTION

Catalyst::Authentication::Store::FromSub::Hash class provides access to authentication information by using a Catalyst Model sub auth.

In sub auth of the Catalyst model, we can use cache there. it would avoid the hit of db every request.

CONFIGURATION

The FromSub::Hash authentication store is activated by setting the store config's class element to 'FromSub::Hash'. See the Catalyst::Plugin::Authentication documentation for more details on configuring the store.

The FromSub::Hash storage module has several configuration options

__PACKAGE__->config->{authentication} = 
                {  
                    default_realm => 'members',
                    realms => {
                        members => {
                            credential => {
                                # ...
                            },
                            store => {
                                class => 'FromSub::Hash',
        	                    model_class => 'UserAuth',
        	                }
            	        }
                	}
                };
class

Class is part of the core Catalyst::Authentication::Plugin module, it contains the class name of the store to be used.

user_class

Contains the class name (as passed to $c->model()) of Catalyst. This config item is REQUIRED.

USAGE

The Catalyst::Authentication::Store::FromSub::Hash storage module is not called directly from application code. You interface with it through the $c->authenticate() call.

EXAMPLES

Adv.

package MyApp::Model::UserAuth; # map with model_class in config above
use base qw/Catalyst::Model/;
use strict;

sub auth {
    my ($self, $c, $userinfo) = @_;
    
    my ($where, $cache_key);
    if (exists $userinfo->{user_id}) {
        $where = { user_id => $userinfo->{user_id} };
        $cache_key = 'global|user|user_id=' . $userinfo->{user_id};
    } elsif (exists $userinfo->{username}) {
        $where = { username => $userinfo->{username} };
        $cache_key = 'global|user|username=' . $userinfo->{username};
    } else { return; }

    my $user;
    if (my $val = $c->cache->get($cache_key) {
        $user = $val;
    } else {
        $user = $c->model('TestApp')->resultset('User')->search( $where )->first;
        $user = $user->{_column_data}; # hash to cache
        $c->cache->set($cache_key, $user);
    }
    
    # validate status
    if ( exists $userinfo->{status} and ref $userinfo->{status} eq 'ARRAY') {
        unless (grep { $_ eq $user->{status} } @{$userinfo->{status}}) {
            return;
        }
    }

    return $user;
}

# for login
sub login : Global {
    my ( $self, $c ) = @_;
    
    $c->authenticate({  
                      username => $c->req->params->username,
                      password => $c->req->params->password,
                      status => [ 'active', 'registered' ],
                      }))
}

TODO

Catalyst::Plugin::Authorization::Roles is not supported or tested yet.

BUGS AND LIMITATIONS

None known currently, please email the author if you find any.

SEE ALSO

Catalyst::Plugin::Authentication, Catalyst::Plugin::Authentication::Internals

AUTHOR

Fayland Lam, <fayland at gmail.com>

COPYRIGHT & LICENSE

Copyright 2007 Fayland Lam, all rights reserved.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.