1 package Catalyst::Authentication::Store::Minimal;
6 use Catalyst::Authentication::User::Hash;
7 use Scalar::Util qw( blessed );
8 use base qw/Class::Accessor::Fast/;
11 __PACKAGE__->mk_accessors(qw/userhash/);
15 my ( $class, $config, $app, $realm) = @_;
17 bless { userhash => $config->{'users'} }, $class;
21 my ( $self, $c, $id ) = @_;
23 return $id if ref $id;
25 $self->find_user( { id => $id } );
28 ## this is not necessarily a good example of what find_user can do, since all we do is
29 ## look up with the id anyway. find_user can be used to locate a user based on other
30 ## combinations of data. See C::P::Authentication::Store::DBIx::Class for a better example
32 my ( $self, $userinfo, $c ) = @_;
34 my $id = $userinfo->{'id'};
36 $id ||= $userinfo->{'username'};
38 return unless exists $self->userhash->{$id};
40 my $user = $self->userhash->{$id};
42 #print STDERR "FOO1! " . ref($user) . " - ". Scalar::Util::blessed($user) . "\n";
44 if ( ref($user) eq "HASH") {
46 return bless $user, "Catalyst::Authentication::User::Hash";
47 } elsif ( ref($user) && blessed($user) && $user->isa('Catalyst::Authentication::User::Hash')) {
50 Catalyst::Exception->throw( "The user '$id' must be a hash reference or an " .
51 "object of class Catalyst::Authentication::User::Hash");
59 # choose a random user
60 scalar keys %{ $self->userhash };
61 ( undef, my $user ) = each %{ $self->userhash };
66 ## Backwards compatibility
68 # This is a backwards compatible routine. get_user is specifically for loading a user by it's unique id
69 # find_user is capable of doing the same by simply passing { id => $id }
70 # no new code should be written using get_user as it is deprecated.
72 my ( $self, $id ) = @_;
73 $self->find_user({id => $id});
76 ## backwards compatibility
80 ### If a user does 'use Catalyst qw/Authentication::Store::Minimal/'
81 ### he will be proxied on to this setup routine (and only then --
82 ### non plugins should NOT have their setup routine invoked!)
83 ### Beware what we pass to the 'new' routine; it wants
84 ### a config has with a top level key 'users'. New style
85 ### configs do not have this, and split by realms. If we
86 ### blindly pass this to new, we will 1) overwrite what we
87 ### already passed and 2) make ->userhash undefined, which
89 ### Can't use an undefined value as a HASH reference at
90 ### lib/Catalyst/Authentication/Store/Minimal.pm line 38.
92 ### So only do this compatibility call if:
93 ### 1) we have a {users} config directive
95 ### Ideally we could also check for:
96 ### 2) we don't already have a ->userhash
97 ### however, that's an attribute of an object we can't
100 my $cfg = $c->config->{'Plugin::Authentication'}->{users}
101 ? $c->config->{'Plugin::Authentication'}
104 $c->default_auth_store( __PACKAGE__->new( $cfg, $c ) ) if $cfg;
117 Catalyst::Authentication::Store::Minimal - Minimal authentication store
121 # you probably just want Store::Minimal under most cases,
122 # but if you insist you can instantiate your own store:
124 use Catalyst::Authentication::Store::Minimal;
130 __PACKAGE__->config->{'Plugin::Authentication'} =
132 default_realm => 'members',
137 password_field => 'password',
138 password_type => 'clear'
144 password => "s00p3r",
146 roles => [qw/edit delete/],
149 password => "s3cr3t",
150 roles => [qw/comment/],
161 This authentication store lets you create a very quick and dirty user
162 database in your application's config hash.
164 You will need to include the Authentication plugin, and at least one Credential
165 plugin to use this Store. Credential::Password is reccommended.
167 It's purpose is mainly for testing, and it should probably be replaced by a
168 more "serious" store for production.
170 The hash in the config, as well as the user objects/hashes are freely mutable
179 The classname used for the store. This is part of
180 L<Catalyst::Plugin::Authentication> and is the method by which
181 Catalyst::Authentication::Store::Minimal is loaded as the
182 user store. For this module to be used, this must be set to
187 This is a simple hash of users, the keys are the usenames, and the values are
188 hashrefs containing a password key/value pair, and optionally, a roles/list
189 of role-names pair. If using roles, you will also need to add the
190 Authorization::Roles plugin.
192 See the SYNOPSIS for an example.
198 There are no publicly exported routines in the Minimal store (or indeed in
199 most authentication stores) However, below is a description of the routines
200 required by L<Catalyst::Plugin::Authentication> for all authentication stores.
202 =head2 new( $config, $app, $realm )
204 Constructs a new store object, which uses the user element of the supplied config
205 hash ref as it's backing structure.
207 =head2 find_user( $authinfo, $c )
209 Keys the hash by the 'id' or 'username' element in the authinfo hash and returns the user.
211 ... documentation fairy stopped here. ...
213 If the return value is unblessed it will be blessed as
214 L<Catalyst::Authentication::User::Hash>.
216 =head2 from_session( $id )
218 Delegates to C<get_user>.
220 =head2 user_supports( )
222 Chooses a random user from the hash and delegates to it.