Mojolicious-Plugin-Fondation-Auth

 view release on metacpan or  search on metacpan

README.md  view on Meta::CPAN


    Model name used for authentication (default: `user`). Must match a model
    declared by [Mojolicious::Plugin::Fondation::User](https://metacpan.org/pod/Mojolicious%3A%3APlugin%3A%3AFondation%3A%3AUser) or another plugin.

        { 'Fondation::Auth' => { model => 'admin' } }

- provider

    Provider class for authentication (default:
    `Mojolicious::Plugin::Fondation::Auth::Provider::DBIx`).
    Must implement `validate_user`, `load_user`, and `auth_form`.

        { 'Fondation::Auth' => { provider => 'MyApp::Auth::Provider::LDAP' } }

- username\_column

    Column name for user login (default: `username`).

- password\_column

    Column name for the Argon2id password hash (default: `password`).

lib/Mojolicious/Plugin/Fondation/Auth.pm  view on Meta::CPAN

                    label       => 'Model Name',
                    type        => 'string',
                    default     => 'user',
                    placeholder => 'Model name from Fondation::User',
                },
                {
                    key         => 'provider',
                    label       => 'Auth Provider Class',
                    type        => 'string',
                    default     => 'Mojolicious::Plugin::Fondation::Auth::Provider::DBIx',
                    placeholder => 'Perl class implementing validate_user, load_user, auth_form',
                },
                {
                    key         => 'username_column',
                    label       => 'Username Column',
                    type        => 'string',
                    default     => 'username',
                },
                {
                    key         => 'password_column',
                    label       => 'Password Column',

lib/Mojolicious/Plugin/Fondation/Auth.pm  view on Meta::CPAN

        %$config,
        app => $app,
    );

    # ── Authentication plugin ────────────────────────────────────────
    $app->plugin('Authentication' => {
        session_key   => $config->{session_key},
        load_user     => sub ($app, $uid) {
            return $provider->load_user($app, $uid);
        },
        validate_user => sub ($c, $username, $password, $extra = {}) {
            return $provider->validate_user($c, $username, $password, $extra);
        },
    });

    # ── Helpers ──────────────────────────────────────────────────────
    $app->helper(auth_form => sub ($c) {
        return $provider->auth_form($c);
    });

    # ── Routes ───────────────────────────────────────────────────────
    my $r = $app->routes;

lib/Mojolicious/Plugin/Fondation/Auth.pm  view on Meta::CPAN


Model name used for authentication (default: C<user>). Must match a model
declared by L<Mojolicious::Plugin::Fondation::User> or another plugin.

    { 'Fondation::Auth' => { model => 'admin' } }

=item provider

Provider class for authentication (default:
C<Mojolicious::Plugin::Fondation::Auth::Provider::DBIx>).
Must implement C<validate_user>, C<load_user>, and C<auth_form>.

    { 'Fondation::Auth' => { provider => 'MyApp::Auth::Provider::LDAP' } }

=item username_column

Column name for user login (default: C<username>).

=item password_column

Column name for the Argon2id password hash (default: C<password>).

lib/Mojolicious/Plugin/Fondation/Auth/Provider.pm  view on Meta::CPAN

package Mojolicious::Plugin::Fondation::Auth::Provider;
$Mojolicious::Plugin::Fondation::Auth::Provider::VERSION = '0.04';
use Mojo::Base -base, -signatures;

has 'app';
has 'name';     # provider name (ex: 'file', 'dbix')
has 'timeout_sessions';

# Methods that each concrete provider must implement
sub validate_user { die "Method 'validate_user' must be implemented by provider" }
sub load_user     { die "Method 'load_user' must be implemented by provider" }

# Helper to log easily from any provider
# sub log ($self, $level, $message) {
#     return unless $self->app && $self->app->can('log');
#     $self->app->log->$level("Auth::Multi::$self->name: $message");
# }

sub log ($self) {
    return unless $self->app && $self->app->can('log');

lib/Mojolicious/Plugin/Fondation/Auth/Provider.pm  view on Meta::CPAN


=head1 VERSION

version 0.04

=head1 SYNOPSIS

    package Mojolicious::Plugin::Fondation::Auth::Provider::File;
    use Mojo::Base 'Mojolicious::Plugin::Fondation::Auth::Provider', -signatures;

    # Then implement validate_user() and load_user()

=head1 NAME

Mojolicious::Plugin::Fondation::Auth::Provider - Base class for authentication providers

=head1 AUTHOR

Daniel Brosseau <dab@cpan.org>

=head1 COPYRIGHT AND LICENSE

lib/Mojolicious/Plugin/Fondation/Auth/Provider/DBIx.pm  view on Meta::CPAN

        $self->model
            ? "DBIx provider initialized for model '$self->{model}'"
            : "DBIx provider initialized (model will be resolved from model_list)"
    );

    return $self;
}

# ── Authentication ────────────────────────────────────────────────────

sub validate_user ($self, $c, $username, $password, $extra = {}) {
    return undef unless $username && $password;

    my $schema = $self->_schema($c);
    return undef unless $schema;

    my $source = $self->_source($c);
    return undef unless $source;

    my $user = $schema->resultset($source)->search({
        $self->username_column => $username,

lib/Mojolicious/Plugin/Fondation/Auth/Provider/DBIx.pm  view on Meta::CPAN

        username_column => 'username',    # optional, default: 'username'
        password_column => 'password',    # optional, default: 'password'
    });

=head1 DESCRIPTION

This provider authenticates users against a L<DBIx::Class> schema, using
L<Mojolicious::Plugin::Fondation::Model::DBIx::Async> for backend configuration
discovery.

Authentication operations (C<validate_user>, C<load_user>) use a synchronous
L<DBIx::Class::Schema> instance built from the same backend config. This is
necessary because L<Mojolicious::Plugin::Authentication> requires synchronous
callbacks.

Password hashing (Argon2id) is handled by the Result class
(L<Mojolicious::Plugin::Fondation::Auth::Schema::Result::User>) via
C<insert>/C<update> hooks — the provider only verifies.

=head1 NAME



( run in 0.461 second using v1.01-cache-2.11-cpan-ad19def0cd9 )