NAME

Maypole::Authentication::Abstract - Abstract Authentication for Maypole

SYNOPSIS

# Simple example of all three security levels
use base qw(Apache::MVC Maypole::Authentication::Abstract);

sub authenticate {
    my $r = shift;
    if ( $r->{table} eq 'openforall' ) {
        $r->public;
    }
    elsif ( $r->{table} eq 'membersonly' ) {
        $r->private;
        $r->{template} = 'login' unless $r->{user};
    }
    elsif ( $r->{table} eq 'topsecret' ) {
        $r->restricted;
        $r->{template} = 'login' unless $r->{user};
    }
}

# Another example
use base qw(Apache::MVC Maypole::Authentication::Abstract);

MyApp->config->{auth} = {
    user_class    => 'MyApp::Customer',
    user_field    => 'email',
    session_class => 'Apache::Session::Postgres',
    session_args  => {
        DataSource => 'dbi:Pg:dbname=myapp',
        UserName   => 'postgres',
        Password   => '',
        Commit     => 1
    }
};

sub authenticate {
    my $r = shift;
    if ( $r->{table} eq 'products' && $r->{action} eq 'list' ) {
        $r->public;
    }
    elsif ( $r->{table} eq 'products' && $r->{action} eq 'search' ) {
        $r->private;
        $r->{template} = 'login' unless $r->{user};
    }
    elsif ( $r->{table} eq 'products' && $r->{action} eq 'edit' ) {
        $r->restricted;
        $r->{template} = 'login' unless $r->{user};
    }
}

# Tickets in templates
<INPUT TYPE="hidden" NAME="ticket" VALUE="[% ticket %]">

# Global session handling is also possible
sub authenticate {
    my $r = shift;
    $r->public;
    if ( $r->{table} eq 'products' && $r->{action} eq 'search' ) {
        $r->private;
        $r->{template} = 'login' unless $r->{user};
    }
    elsif ( $r->{table} eq 'products' && $r->{action} eq 'edit' ) {
        $r->restricted;
        $r->{template} = 'login' unless $r->{user};
    }
}

DESCRIPTION

This module is based on Maypole::Authentication::UserSessionCookie but adds some more advanced features.

For example we have three levels of security:

    Public: No authentication, only session management
   Private: Authenticate once, go everywhere
Restricted: Authenticate and reauthorize with a ticket for every
            request (best used in a post form as hidden input)

The configuration works similar to Maypole::Authentication::UserSessionCookie but with some little additions.

$r->{session_id} can be used from parse_path() for example,
useful if the user has cookies disabled.

We provide a number of methods to be inherited by a Maypole class. The three methods public, private and restricted determine the security level.

public

$r->public;

public checks for a session cookie and looks into the session_id slot of the Maypole request and then populates the resulting session hash to the session slot.

private

$r->private;

private does the same as public but also calls check_credentials if you haven't authorized before. If the login was successful it populates a User object to the user slot of the Maypole object.

restricted

$r->restricted;

restricted does the same as private but also calls ticket.

login

This method creates the session hash. It also sets $r-{template_args}{session_id}>.

logout

This method deletes the session hash.

check_credentials

This method checks for two form parameters (typically user and password but configurable) and does a search on the user class for those values. If the credentials are wrong, then $r-{template_args}{login_error}> is set to an error string.

uid_to_user

This method returns the result of a retrieve on the UID from the user class.

ticket

This method checks for a form parameter, ticket and reauthorizes the user whenever it is called. By default the ticket is just a serialized array represented as hex string containing the user and the password, but it is very simple to overload ticket with a better method. Use a Crypt:: module or even Kerberos! It also sets $r-{template_args}{ticket}>.

TODO

Better documentation.

AUTHOR

Sebastian Riedel, sri@cpan.org

COPYRIGHT

Copyright 2004 Sebastian Riedel. All rights reserved.