3 package Catalyst::Plugin::Authentication;
5 use base qw/Class::Accessor::Fast Class::Data::Inheritable/;
8 __PACKAGE__->mk_accessors(qw/_user/);
9 __PACKAGE__->mk_classdata($_) for qw/_auth_stores _auth_store_names/;
18 our $VERSION = "0.01";
20 sub set_authenticated {
21 my ( $c, $user ) = @_;
24 $c->request->{user} = $user; # compatibility kludge
26 if ( $c->isa("Catalyst::Plugin::Session")
27 and $c->config->{authentication}{use_session}
28 and $user->supports("session") )
30 $c->save_user_in_session($user);
33 $c->NEXT::set_authenticated($user);
45 if ( $user and !Scalar::Util::blessed($user) ) {
46 return $c->auth_restore_user($user);
52 sub save_user_in_session {
53 my ( $c, $user ) = @_;
55 my $store = $user->store || ref $user;
56 $c->session->{__user_store} = $c->get_auth_store_name($store) || $store;
57 $c->session->{__user} = $user->for_session;
65 if ( $c->isa("Catalyst::Plugin::Session")
66 and $c->config->{authentication}{use_session} )
68 delete @{ $c->session }{qw/__user __user_store/};
75 if ( my $store = $c->default_auth_store ) {
76 return $store->get_user($uid);
79 Catalyst::Exception->throw(
80 "The user id $uid was passed to an authentication "
81 . "plugin, but no default store was specified" );
86 my $c = shift->NEXT::prepare(@_);
88 if ( $c->isa("Catalyst::Plugin::Session")
91 if ( $c->sessionid and my $frozen_user = $c->session->{__user} ) {
92 $c->_user($frozen_user);
99 sub auth_restore_user {
100 my ( $c, $frozen_user, $store_name ) = @_;
103 unless $c->isa("Catalyst::PLugin::Session")
104 and $c->config->{authentication}{use_session}
107 $store_name ||= $c->session->{__user_store};
108 $frozen_user ||= $c->session->{__user};
110 my $store = $c->get_auth_store($store_name);
111 $c->_user( my $user = $store->from_session( $c, $frozen_user ) );
120 my $cfg = $c->config->{authentication} || {};
127 $c->register_auth_stores(
128 default => $cfg->{store},
129 %{ $cfg->{stores} || {} },
136 my ( $self, $name ) = @_;
137 $self->auth_stores->{$name} || ( Class::Inspector->loaded($name) && $name );
140 sub get_auth_store_name {
141 my ( $self, $store ) = @_;
142 $self->auth_store_names->{$store};
145 sub register_auth_stores {
146 my ( $self, %new ) = @_;
148 foreach my $name ( keys %new ) {
149 my $store = $new{$name} or next;
150 $self->auth_stores->{$name} = $store;
151 $self->auth_store_names->{$store} = $name;
157 $self->_auth_stores(@_) || $self->_auth_stores( {} );
160 sub auth_store_names {
163 $self->_auth_store_names || do {
164 tie my %hash, 'Tie::RefHash';
165 $self->_auth_store_names( \%hash );
169 sub default_auth_store {
172 if ( my $new = shift ) {
173 $self->register_auth_stores( default => $new );
176 $self->get_auth_store("default");
187 Catalyst::Plugin::Authentication - Infrastructure plugin for the Catalyst
188 authentication framework.
194 Authentication::Store::Foo
195 Authentication::Credential::Password
200 The authentication plugin is used by the various authentication and
201 authorization plugins in catalyst.
203 It defines the notion of a logged in user, and provides integration with the
204 L<Catalyst::Plugin::Session> plugin,
212 Returns the currently logged user or undef if there is none.
216 Delete the currently logged in user from C<user> and the session.
220 Delegate C<get_user> to the default store.
224 =head1 METHODS FOR STORE MANAGEMENT
226 =item default_auth_store
228 Return the store whose name is 'default'.
230 This is set to C<<$c->config->{authentication}{store}>> if that value exists,
231 or by using a Store plugin:
233 use Catalyst qw/Authentication Authentication::Store::Minimal/;
235 Sets the default store to
236 L<Catalyst::Plugin::Authentication::Store::Minimal::Backend>.
238 =item get_auth_store $name
240 Return the store whose name is $name.
242 =item get_auth_store_name $store
244 Return the name of the store $store.
248 A hash keyed by name, with the stores registered in the app.
250 =item auth_store_names
252 A ref-hash keyed by store, which contains the names of the stores.
254 =item register_auth_stores %stores_by_name
256 Register stores into the application.
258 =head1 INTERNAL METHODS
262 =item set_authenticated $user
264 Marks a user as authenticated. Should be called from a
265 C<Catalyst::Plugin::Authentication::Credential> plugin after successful
268 This involves setting C<user> and the internal data in C<session> if
269 L<Catalyst::Plugin::Session> is loaded.
271 =item auth_restore_user $user
273 Used to restore a user from the session, by C<user> only when it's actually
276 =item save_user_in_session $user
278 Used to save the user in a session.
282 Revives a user from the session object if there is one.
286 Sets the default configuration parameters.
298 Whether or not to store the user's logged in state in the session, if the
299 application is also using the L<Catalyst::Plugin::Authentication> plugin.