Cataly...cation(3pm)
π¦ Catalyst::Plugin::Authentication, bestie π¦
okay so welcome to the manual page for Catalyst::Plugin::Authentication β yes, the header says Cataly...cation(3pm) because manpage headers love a little dramatic truncation, and it's from User Contributed Perl Documentation. we are so back. π
π NAME π
Catalyst::Plugin::Authentication β the infrastructure plugin for the Catalyst authentication framework. literally the backbone bestie. π«Ά
β¨ SYNOPSIS β¨
here's the copy-paste blessing:
use Catalyst qw/
Authentication
/;
# later on ...
$c->authenticate({ username => 'myusername',
password => 'mypassword' });
my $age = $c->user->get('age');
$c->logout;
π DESCRIPTION π
okay so the authentication plugin gives your Catalyst app generic user support. it's the basis for both authentication (checking the user is who they claim to be) and authorization (letting the user do what the system authorises them to do). both. iconic behavior. π
Using authentication splits into two parts. A Store is what actually stores the user information, and it can store any amount of data related to the user. Credentials verify users, using information from the store plus data from the frontend. A Credential and a Store get paired up to form a 'Realm'. a Catalyst application using the authentication framework must have at least one realm, and may have several. no cap. π
to implement authentication in a Catalyst application you need to add this module, and specify at least one realm in the configuration. that's the bare minimum bestie. π«Ά
authentication data can also be stored in a session, if the application is using the Catalyst::Plugin::Session module. cute. πΈ
π NOTE β in version 0.10 of this module, the interface to this module changed. please see "COMPATIBILITY ROUTINES" for more information. yes, the quotes are part of the original reference vibe. don't skip it. π
π INTRODUCTION π
π§ The Authentication/Authorization Process π§
web applications typically need to identify a user β to tell that user apart from other users. usually this is so they can display private information that is only that user's business, or limit access to the application so only certain entities can access certain parts. very main character privacy energy. π
this process is split into several steps. first, you ask the user to identify themselves. at this point you can't be sure the user is really who they claim to be. π
then the user tells you who they are, and backs that claim with some piece of information that only the real user could give you. for example, a password is a secret known to both the user and you. when the user tells you this password, you can assume they're in on the secret and can be trusted (ignore identity theft for now π). checking the password, or any other proof, is called credential verification.
by this time you know exactly who the user is β the user's identity is authenticated. this is where this module's job stops, and your application or other plugins step in. it's giving relay race handoff. πββοΈ
the next logical step is authorization, the process of deciding what a user is (or isn't) allowed to do. for example, say your users are split into two main groups β regular users and administrators. you want to verify that the currently logged in user is indeed an administrator before performing the actions in an administrative part of your application. these decisions may be made within your application code using just the information available after authentication, or it may be facilitated by a number of plugins. both are valid, iykyk. β¨
π The Components In This Framework π
π Realms π
configuration of the Catalyst::Plugin::Authentication framework is done in terms of realms. in simplest terms, a realm is a pairing of a Credential verifier and a User storage (Store) backend. as of version 0.10003, realms are now objects that you can create and customize. glow-up complete. π
an application can have any number of Realms, each of which operates independent of the others. each realm has a name, which is used to identify it as the target of an authentication request. this name can be anything, such as 'users' or 'members'. one realm must be defined as the default_realm, which is used when no realm name is specified. more information about configuring realms is available in the configuration section. periodt. π
π Credential Verifiers π
when user input is transferred to the Catalyst application (typically via form inputs), the application may pass this information into the authentication system through the $c->authenticate() method. from there, it is passed to the appropriate Credential verifier. slay. β¨
these plugins check the data, and ensure that it really proves the user is who they claim to be. literally the proof check. π₯
credential verifiers compatible with versions of this module 0.10x and upwards should be in the namespace Catalyst::Authentication::Credential. exact namespace, bestie. don't freestyle it. π«Ά
πΈ Storage Backends πΈ
the authentication data also identifies a user, and the Storage backend modules use this data to locate and return a standardized object-oriented representation of a user. very organized. π
when a user is retrieved from a store it is not necessarily authenticated. Credential verifiers accept a set of authentication data and use this information to retrieve the user from the store they are paired with. that pairing matters, okay? π₯
storage backends compatible with versions of this module 0.10x and upwards should be in the namespace Catalyst::Authentication::Store. again: exact namespace. π
π§ The Core Plugin π§
this plugin on its own is the glue, providing realm configuration, session integration, and other goodness for the other plugins. it's the friend who organizes the group chat. π«Ά
π Other Plugins π
more layers of plugins can be stacked on top of the authentication code. for example, Catalyst::Plugin::Session::PerUser provides an abstraction of browser sessions that is more persistent per user. Catalyst::Plugin::Authorization::Roles provides an accepted way to separate and group users into categories, and then check which categories the current user belongs to. stacking? we love to see it. π
π EXAMPLE π
Okay so picture this: we're storing users in a plain old Perl hash. To verify someone, they give you a password and you check it against the hash.
That means our app starts out looking like this:
package MyApp;
use Catalyst qw/
Authentication
/;
__PACKAGE__->config( 'Plugin::Authentication' =>
{
default => {
credential => {
class => 'Password',
password_field => 'password',
password_type => 'clear'
},
store => {
class => 'Minimal',
users => {
bob => {
password => "s00p3r",
editor => 'yes',
roles => [qw/edit delete/],
},
william => {
password => "s3cr3t",
roles => [qw/comment/],
}
}
}
}
}
);
This tells the auth plugin what realms are available, which credential and store modules are used, and how each one is configured. With this code loaded, we can now attempt to authenticate users.
To show that off, let's make an authentication controller:
package MyApp::Controller::Auth;
sub login : Local {
my ( $self, $c ) = @_;
if ( my $user = $c->req->params->{user}
and my $password = $c->req->params->{password} )
{
if ( $c->authenticate( { username => $user,
password => $password } ) ) {
$c->res->body( "hello " . $c->user->get("name") );
} else {
# login incorrect
}
}
else {
# invalid form input
}
}
This one's pretty self-explanatory. If all the necessary fields are supplied, call the authenticate method on the context object. If it succeeds, the user is logged in.
Your credential verifier goes looking for the user whose details match the authentication information you passed to $c->authenticate(). Once it fetches that user, the password gets checked, and if it matches, the user is authenticated and $c->user holds the user object retrieved from the store.
In the above case, the default realm is checked, but we could just as easily check an alternate realm. If this were an admin login, for example, we could authenticate on the admin realm by simply changing the $c->authenticate() call:
if ( $c->authenticate( { username => $user,
password => $password }, 'admin' ) ) {
$c->res->body( "hello " . $c->user->get("name") );
} ...
Now suppose we want to restrict the ability to edit to a user with an 'editor' value of yes.
The restricted action might look like this:
sub edit : Local {
my ( $self, $c ) = @_;
$c->detach("unauthorized")
unless $c->user_exists
and $c->user->get('editor') eq 'yes';
# do something restricted here
}
(Note that if you have multiple realms, you can use $c->user_in_realm('realmname') in place of $c->user_exists(); This will essentially perform the same verification as user_exists, with the added requirement that if there is a user, it must have come from the realm specified.)
The above example is somewhat similar to role based access control. Catalyst::Authentication::Store::Minimal treats the roles field as an array of role names. Let's leverage this. Add the role authorization plugin:
use Catalyst qw/
...
Authorization::Roles
/;
sub edit : Local {
my ( $self, $c ) = @_;
$c->detach("unauthorized") unless $c->check_user_roles("edit");
# do something restricted here
}
This is somewhat simpler and will work if you change your store, too, since the role interface is consistent.
Let's say your app grows, and you now have 10,000 users. It's no longer efficient to maintain a hash of users, so you move this data to a database. You can accomplish this simply by installing the DBIx::Class Store and changing your config:
__PACKAGE__->config( 'Plugin::Authentication' =>
{
default_realm => 'members',
members => {
credential => {
class => 'Password',
password_field => 'password',
password_type => 'clear'
},
store => {
class => 'DBIx::Class',
user_model => 'MyApp::Users',
role_column => 'roles',
}
}
}
);
The authentication system works behind the scenes to load your data from the new source. The rest of your application is completely unchanged.
π οΈ CONFIGURATION π οΈ
# example
__PACKAGE__->config( 'Plugin::Authentication' =>
{
default_realm => 'members',
members => {
credential => {
class => 'Password',
password_field => 'password',
password_type => 'clear'
},
store => {
class => 'DBIx::Class',
user_model => 'MyApp::Users',
role_column => 'roles',
}
},
admins => {
credential => {
class => 'Password',
password_field => 'password',
password_type => 'clear'
},
store => {
class => '+MyApp::Authentication::Store::NetAuth',
authserver => '192.168.10.17'
}
}
}
);
π NOTE: Until version0.10008of this module, you would need to put all the realms inside a"realms"key in the configuration. Please see"COMPATIBILITY CONFIGURATION"for more information
π use_session π
Whether or not to store the user's logged in state in the session, if the application is also using Catalyst::Plugin::Session. This value is set to true per default.
However, even if use_session is disabled, if any code touches $c->session, a session object will be auto-vivified and session Cookies will be sent in the headers. To prevent accidental session creation, check if a session already exists with if ($c->sessionid) { ... }. If the session doesn't exist, then don't place anything in the session to prevent an unnecessary session from being created.
πΈ default_realm πΈ
This defines which realm should be used as when no realm is provided to methods that require a realm such as authenticate or find_user.
π¦ realm refs π¦
The Plugin::Authentication config hash contains the series of realm configurations you want to use for your app. The only rule here is that there must be at least one. A realm consists of a name, which is used to reference the realm, a credential and a store. You may also put your realm configurations within a subelement called 'realms' if you desire to separate them from the remainder of your configuration. Note that if you use a 'realms' subelement, you must put ALL of your realms within it.
You can also specify a realm class to instantiate instead of the default Catalyst::Authentication::Realm class using the 'class' element within the realm config.
Each realm config contains two hashes, one called 'credential' and one called 'store', each of which provide configuration details to the respective modules. The contents of these hashes is specific to the module being used, with the exception of the 'class' element, which tells the core Authentication module the classname to instantiate.
The 'class' element follows the standard Catalyst mechanism of class specification. If a class is prefixed with a +, it is assumed to be a complete class name. Otherwise it is considered to be a portion of the class name. For credentials, the classname 'Password', for example, is expanded to Catalyst::Authentication::Credential::Password. For stores, the classname 'storename' is expanded to: Catalyst::Authentication::Store::storename.
β¨ METHODS β¨
$c->authenticate( $userinfo [, $realm ] )β tries to log the user in using the info in the$userinfohash reference, checking against the realm$realm. You can skip$realm, and then it just checks the default realm. easy π$c->user( )β returns whoever's logged in rn, orundefif nobody is. normally the user gets re-fetched fresh from the store β like, forCatalyst::Authentication::Store::DBIx::Classthe user gets re-restored using the primary key of the user table. which means lowkeyusercan throw an error even thoughuser_existsreturned true. π not a vibe but that's the deal.$c->user_exists( )β returns true if someone's logged in right now. the difference betweenuser_existsanduseris thatuser_existssays true if a user is logged in even if they haven't been retrieved from the storage backend yet. so if all you need to know is "is somebody logged in," this can be way more efficient depending on your storage setup.user_existsonly peeks at the session, whileuseractually tries to restore the user. π΅οΈββοΈ$c->user_in_realm( $realm )β same energy asuser_exists, except it only returns true if a user is both logged in right now and was retrieved from the realm you passed in.$c->logout( )β logs the user out. deletes the currently logged in user from"$c->user"and from the session. it does not delete the session, bestie β read that again.$c->find_user( $userinfo, $realm )β grabs a specific user's details, matching the user info you give it, from the realm in$realm.
$user = $c->find_user({ id => $id });
$c->set_authenticated($user); # logs the user in and calls persist_user
persist_user()β normally user data only gets saved to the session during the initial authentication. this call makes the auth system save the currently authenticated user's data across requests. super useful if you changed the user data and want future requests to reflect the most-current stuff. it assumes that at the time of the call,$c->userholds the most current data. β¨find_realm_for_persisted_user()β private method, do not call from user code! π
π INTERNAL METHODS π
these are for Catalyst::Plugin::Authentication INTERNAL USE only. please don't use them in your own code β not in your app, not in credential modules, not in store modules. if you do, you will very likely get the nasty shock of having to fix / rewrite your code when things change. they're documented here only for reference. fr fr, don't. π
$c->set_authenticated( $user, $realmname )β marks a user as authenticated. gets called from inside theauthenticateroutine when a credential returns a user.$realmnamedefaults to'default'. you can usefind_userto get$user.$c->auth_restore_user( $user, $realmname )β used to restore a user from the session. in most cases it's called with no arguments to restore the user via the session. can be called with arguments when restoring a user from some other method β but currently it's not used that way.$c->auth_realms( )β returns a hashref full ofrealmnameβ realm instance pairs. each realm instance contains an instantiated store and credential object as the'store'and'credential'elements, respectively.$c->get_auth_realm( $realmname )β retrieves the realm instance for whichever$realmnameyou hand it.$c->update_user_in_sessionβ this was a short-lived method to update user info β you should usepersist_userinstead. π$c->setup_auth_realm( )
π OVERRIDDEN METHODS π
$c->setup( )
π SEE ALSO π
this list might not be up to date. below are the modules known to work with the updated API of 0.10, which means they're realm-compatible. π¦
Realms
Catalyst::Authentication::Realm
User Storage Backends
Catalyst::Authentication::Store::MinimalCatalyst::Authentication::Store::DBIx::ClassCatalyst::Authentication::Store::LDAPCatalyst::Authentication::Store::RDBOCatalyst::Authentication::Store::Model::KiokuDBCatalyst::Authentication::Store::Jifty::DBICatalyst::Authentication::Store::Htpasswd
Credential verification
Catalyst::Authentication::Credential::PasswordCatalyst::Authentication::Credential::HTTPCatalyst::Authentication::Credential::OpenIDCatalyst::Authentication::Credential::Authen::SimpleCatalyst::Authentication::Credential::FlickrCatalyst::Authentication::Credential::TestingCatalyst::Authentication::Credential::AuthTktCatalyst::Authentication::Credential::Kerberos
Authorization
Catalyst::Plugin::Authorization::ACL,Catalyst::Plugin::Authorization::Roles
Internals Documentation
Catalyst::Plugin::Authentication::Internals
Misc
Catalyst::Plugin::Session,Catalyst::Plugin::Session::PerUser
π DON'T SEE ALSO π
this module, along with its sub plugins, deprecates a whole bunch of other modules. that includes Catalyst::Plugin::Authentication::Simple and Catalyst::Plugin::Authentication::CDBI. we don't stan those anymore, sorry not sorry. π
π¬ INCOMPATABILITIES π¬
the realms-based configuration and functionality of the 0.10 update of Catalyst::Plugin::Authentication required a change in the API used by credentials and stores. it has a compatibility mode which lets you use modules that haven't been updated yet. this, however, completely mimics the older api and disables the new realm-based features. in other words: you cannot mix the older credential and store modules with realms, or with realm-based configs. the changes needed to update modules are relatively minor and are covered in Catalyst::Plugin::Authentication::Internals. we hope most modules will move to the compatible list above super quickly. π«Ά
π§ COMPATIBILITY CONFIGURATION π§
until version 0.10008 of this module, you needed to put all the realms inside a "realms" key in the configuration.
# example
__PACKAGE__->config( 'Plugin::Authentication' =>
{
default_realm => 'members',
realms => {
members => {
...
},
},
}
);
if you use the old, deprecated "__PACKAGE__->config( 'authentication' )" configuration key, then the realms key is still required. π₯
π COMPATIBILITY ROUTINES π
in version 0.10 of Catalyst::Plugin::Authentication, the API changed. for app developers this change is fairly minor, but for Credential and Store authors the changes are significant.
please see the documentation in version 0.09 of Catalyst::Plugin::Authentication for a better understanding of how the old API functioned.
the items below are still present in the plugin, though using them is deprecated. they remain only as a transition tool, for those sites that can't yet be upgraded to the new system because of local customizations, or because they use Credential / Store modules that haven't yet been updated to work with the new API.
these routines should not be used in any application using realms functionality or any of the methods described above. these are for reference purposes only. β
$c->login( )β this method is used to initiate authentication and user retrieval. technically it's part of the old Password credential module and it still resides in the Password class. it's included here for reference only.$c->default_auth_store( )β returns the store whose name is'default'.
this is set to "$c->config( 'Plugin::Authentication' => { store => # Store} )" if that value exists, or by using a Store plugin:
# load the Minimal authentication store.
use Catalyst qw/Authentication Authentication::Store::Minimal/;
sets the default store to Catalyst::Plugin::Authentication::Store::Minimal.
$c->get_auth_store( $name )β returns the store whose name is$name.$c->get_auth_store_name( $store )β returns the name of the store$store.$c->auth_stores( )β a hash keyed by name, with the stores registered in the app.$c->register_auth_stores( %stores_by_name )β registers stores into the application.$c->auth_store_names( )$c->get_user( )
π«Ά SUPPORT π«Ά
please use the rt.cpan.org bug tracker, and git patches are wecome. (their spelling, not mine π )
questions on usage should go to the Catalyst mailing list or the #catalyst irc channel. we're nice, come say hi π¦
πΈ AUTHORS πΈ
- Yuval Kogman,
"nothingmuch@woobling.org"β original author - Jay Kuri,
"jayk@cpan.org"β Large rewrite
β PRIMARY MAINTAINER β
- Tomas Doran (t0m),
"bobtfish@bobtfish.net"
π ADDITIONAL CONTRIBUTORS π
- Jess Robinson
- David Kamholz
- kmx
- Nigel Metheringham
- Florian Ragwitz
"rafl@debian.org" - Stephan Jauernick
"stephanj@cpan.org" - Oskari Ojala (Okko),
"perl@okko.net" - John Napiorkowski (jnap)
"jjnapiork@cpan.org"
π COPYRIGHT & LICENSE π
Copyright (c) 2005 - 2012 the Catalyst::Plugin::Authentication "AUTHORS", "PRIMARY MAINTAINER" and "ADDITIONAL CONTRIBUTORS" as listed above.
this program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
and that's the whole page, bestie, you made it to the end π this gorgeous thing came to you courtesy of perl v5.40.1, dated 2026-05-22, and it's the Cataly...cation(3pm) manpage β go forth and authenticate responsibly, ily, bye πβ¨
π¦ where this page comes from
- ubuntu stonking: libcatalyst-plugin-authentication-perl 0.10026-1 Β· Artistic-1.0-Perl OR GPL-1.0-or-later
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms