Catalyst::Authentication::Store::Jifty::DBI - A storage class for Catalyst Authentication using Jifty::DBI
use Catalyst qw( Authentication Authorization::Roles ); __PACKAGE__->config->{authentication} = { default_realm => 'members', realms => { members => { credential => { class => 'Password', password_field => 'password', password_type => 'clear', }, store => { class => 'Jifty::DBI', user_class => 'MyDB::User', role_relation => [qw( roles role_map role )], }, }, }, }; sub login : Global { my ($self, $c) = @_; $c->authenticate({ username => $c->req->params->{username}, password => $c->req->params->{password}, status => [ 'registered', 'loggedin', 'active' ], }); } sub edit : Path { my ($self, $c) = @_; # verify a role if ( $c->check_user_roles('editor') ) { # do some editorial things } }
This Jifty::DBI store class is a rough port of Catalyst::Authentication::Store::DBIx::Class. See Catalyst::Authentication::Store::DBIx::Class and Catalyst::Plugin::Authentication for what I'm too lazy to explain.
Almost the same as ::Store::DBIx::Class, with a few changes. See SYNOPSIS for common usage. To activate this authentication store, set class element in the store config to 'Jifty::DBI'.
__PACKAGE__->config->{authentication} = { default_realm => 'members', realms => { members => { credential => { # ... }, store => { class => 'Jifty::DBI', user_class => 'MyDB::User', role_relation => [qw( roles link_to_role role )], }, }, }, };
There are several configurable options:
should be set to 'Jifty::DBI' to activate this store.
must contain the moniker (the class name which would be passed to $c->model(...) ) to retrieve user information. You can set either the one for a record or the one for a collection (both of which would be converted internally). If you dare, you also can set record_class and/or collection_class as you wish.
If your role information is stored in the same table as the rest of your user information, set this to show which column contains your role information. The value in this column is expected to be a series of role names separated by some combination of white spaces, commas, or pipe characters.
NOTE: this option is different from the one of Catalyst::Authentication::Store::DBIx::Class.
If your role information is stored in a separate table, set this to an array reference of the method chain to retrieve role information from a user record. That means: if your user class has a 'roles' collection, and each of whose record is linked to your role class via 'link_to_role' column, and your role class has a 'role' column, then set this as shown above.
If this flag is set to true, the data for the user object is retrieved from a restored hash (instead of the user table in the database).
Normally, all you need to do is pass enough pairs of column/value to $c->authenticate() to find an (rather, the only one) appropriate user. All the conditions should be satisfied ("and" conditions).
if ( $c->authenticate({ username => $c->req->params->{username}, password => $c->req->params->{password}, status => [ 'registered', 'active', 'loggedin' ], }) ) { # ... authenticated user code here }
If you want finer control, namely when you want "or" conditions, you can pass either of the extra (advanced) arguments. These advanced arguments should be placed under the "jifty_dbi" key for this purpose.
You can put arbitrary arguments (an array reference of hash references) under the "limit_args", each of which would then be passed to $user_collection->limit(). Use "subclause" for "or" conditions. See Jifty::Manual::Cookbook for details.
if ( # this makes "WHERE (username = ?) or (email = ?)" kind of clause $c->authenticate({ password => $c->req->params->{password}, jifty_dbi => { limit_args => [{ column => 'username', value => $c->req->params->{username}, subclause => 'or_condition', }, { column => 'email', value => $c->req->params->{email}, subclause => 'or_condition', }], } }) ) { # ... authenticated user code here }
If you want much finer control, you can pass pre-configured collection object.
my $collection = $c->model('MyDB::User'); # do whatever you want with this $collection if ( $c->authenticate({ password => $c->req->params->{password}, jifty_dbi => { collection => $collection }, }) ) { # ... authenticated user code here }
NOTE: When multiple users are found, $c->user holds the "first" one (retrieved by $collection->first).
Most of these are used internally while authenticating/authorizing and usually you don't need to care.
creates a store object.
finds a user with provided auth information.
revives a user from the session.
stores a user for the session.
shows what this store supports.
will be called if you set the realm's "auto_update_user" setting.
will be called if you set the realm's "auto_create_user" setting.
Catalyst::Plugin::Authentication, Catalyst::Authentication::Store::DBIx::Class
Kenichi Ishigaki, <ishigaki@cpan.org>
Copyright (C) 2008 by Kenichi Ishigaki.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
To install Catalyst::Authentication::Store::Jifty::DBI, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Catalyst::Authentication::Store::Jifty::DBI
CPAN shell
perl -MCPAN -e shell install Catalyst::Authentication::Store::Jifty::DBI
For more information on module installation, please visit the detailed CPAN module installation guide.