1 package Catalyst::Authentication::Store::DBIx::Class;
5 use base qw/Class::Accessor::Fast/;
7 our $VERSION= "0.1081";
11 __PACKAGE__->mk_accessors(qw/config/);
16 my ( $class, $config, $app ) = @_;
18 ## figure out if we are overriding the default store user class
19 $config->{'store_user_class'} = (exists($config->{'store_user_class'})) ? $config->{'store_user_class'} :
20 "Catalyst::Authentication::Store::DBIx::Class::User";
22 ## make sure the store class is loaded.
23 Catalyst::Utils::ensure_class_loaded( $config->{'store_user_class'} );
25 ## fields can be specified to be ignored during user location. This allows
26 ## the store to ignore certain fields in the authinfo hash.
28 $config->{'ignore_fields_in_find'} ||= [ ];
39 ## let's use DBIC's get_columns method to return a hash and save / restore that
40 ## from the session. Then we can respond to get() calls, etc. in most cases without
41 ## resorting to a DB call. If user_object is called, THEN we can hit the DB and
42 ## return a real object.
44 my ( $self, $c, $frozenuser ) = @_;
46 # return $frozenuser if ref $frozenuser;
48 my $user = $self->config->{'store_user_class'}->new($self->{'config'}, $c);
49 return $user->from_session($frozenuser, $c);
53 my ($self, $c, $user) = @_;
55 return $user->for_session($c);
59 my ( $self, $authinfo, $c ) = @_;
61 my $user = $self->config->{'store_user_class'}->new($self->{'config'}, $c);
63 return $user->load($authinfo, $c);
69 # this can work as a class method on the user class
70 $self->config->{'store_user_class'}->supports( @_ );
73 sub auto_create_user {
74 my( $self, $authinfo, $c ) = @_;
75 my $res = $self->config->{'store_user_class'}->new($self->{'config'}, $c);
76 return $res->auto_create( $authinfo, $c );
79 sub auto_update_user {
80 my( $self, $authinfo, $c, $res ) = @_;
81 $res->auto_update( $authinfo, $c );
91 Catalyst::Authentication::Store::DBIx::Class - A storage class for Catalyst Authentication using DBIx::Class
95 This documentation refers to version 0.108.
101 Authorization::Roles/;
103 __PACKAGE__->config->{authentication} =
105 default_realm => 'members',
110 password_field => 'password',
111 password_type => 'clear'
114 class => 'DBIx::Class',
115 user_model => 'MyApp::User',
116 role_relation => 'roles',
117 role_field => 'rolename',
126 my ( $self, $c ) = @_;
129 screen_name => $c->req->params->username,
130 password => $c->req->params->password,
131 status => [ 'registered', 'loggedin', 'active']
137 if ( $c->check_user_roles( 'editor' ) ) {
143 The Catalyst::Authentication::Store::DBIx::Class class provides
144 access to authentication information stored in a database via DBIx::Class.
148 The DBIx::Class authentication store is activated by setting the store
149 config's B<class> element to DBIx::Class as shown above. See the
150 L<Catalyst::Plugin::Authentication> documentation for more details on
151 configuring the store. You can also use
152 L<Catalyst::Authentication::Realm::SimpleDB> for a simplified setup.
154 The DBIx::Class storage module has several configuration options
157 __PACKAGE__->config->{authentication} =
159 default_realm => 'members',
166 class => 'DBIx::Class',
167 user_model => 'MyApp::User',
168 role_relation => 'roles',
169 role_field => 'rolename',
170 ignore_fields_in_find => [ 'remote_name' ],
171 use_userdata_from_session => 1,
181 Class is part of the core Catalyst::Plugin::Authentication module; it
182 contains the class name of the store to be used.
186 Contains the model name (as passed to $c->model()) of the DBIx::Class schema
187 to use as the source for user information. This config item is B<REQUIRED>.
188 (Note that this option used to be called user_class. user_class is still
189 functional, but should be used only for compatibility with previous configs.)
193 If your role information is stored in the same table as the rest of your user
194 information, this item tells the module which field contains your role
195 information. The DBIx::Class authentication store expects the data in this
196 field to be a series of role names separated by some combination of spaces,
197 commas, or pipe characters.
201 If your role information is stored in a separate table, this is the name of
202 the relation that will lead to the roles the user is in. If this is
203 specified, then a role_field is also required. Also when using this method
204 it is expected that your role table will return one row for each role
209 This is the name of the field in the role table that contains the string
210 identifying the role.
212 =item ignore_fields_in_find
214 This item is an array containing fields that may be passed to the
215 $c->authenticate() routine (and therefore find_user in the storage class), but
216 which should be ignored when creating the DBIx::Class search to retrieve a
217 user. This makes it possible to avoid problems when a credential requires an
218 authinfo element whose name overlaps with a column name in your users table.
219 If this doesn't make sense to you, you probably don't need it.
221 =item use_userdata_from_session
223 Under normal circumstances, on each request the user's data is re-retrieved
224 from the database using the primary key for the user table. When this flag
225 is set in the configuration, it causes the DBIx::Class store to avoid this
226 database hit on session restore. Instead, the user object's column data
227 is retrieved from the session and used as-is.
229 B<NOTE>: Since the user object's column
230 data is only stored in the session during the initial authentication of
231 the user, turning this on can potentially lead to a situation where the data
232 in $c->user is different from what is stored the database. You can force
233 a reload of the data from the database at any time by calling $c->user->get_object(1);
234 Note that this will update $c->user for the remainder of this request.
235 It will NOT update the session. If you need to update the session
236 you should call $c->update_user_in_session() as well.
238 =item store_user_class
240 This allows you to override the authentication user class that the
241 DBIx::Class store module uses to perform its work. Most of the
242 work done in this module is actually done by the user class,
243 L<Catalyst::Authentication::Store::DBIx::Class::User>, so
244 overriding this doesn't make much sense unless you are using your
245 own class to extend the functionality of the existing class.
246 Chances are you do not want to set this.
250 In most cases, this config variable does not need to be set, as
251 Catalyst::Authentication::Store::DBIx::Class will determine the primary
252 key of the user table on its own. If you need to override the default,
253 or your user table has multiple primary keys, then id_field
254 should contain the column name that should be used to restore the user.
255 A given value in this column should correspond to a single user in the database.
256 Note that this is used B<ONLY> when restoring a user from the session and
257 has no bearing whatsoever in the initial authentication process. Note also
258 that if use_userdata_from_session is enabled, this config parameter
265 The L<Catalyst::Authentication::Store::DBIx::Class> storage module
266 is not called directly from application code. You interface with it
267 through the $c->authenticate() call.
269 There are three methods you can use to retrieve information from the DBIx::Class
270 storage module. They are Simple retrieval, and the advanced retrieval methods
271 Searchargs and Resultset.
273 =head2 Simple Retrieval
275 The first, and most common, method is simple retrieval. As its name implies
276 simple retrieval allows you to simply to provide the column => value pairs
277 that should be used to locate the user in question. An example of this usage
280 if ($c->authenticate({
281 screen_name => $c->req->params->{'username'},
282 password => $c->req->params->{'password'},
283 status => [ 'registered', 'active', 'loggedin']
286 # ... authenticated user code here
289 The above example would attempt to retrieve a user whose username column (here,
290 screen_name) matched the username provided, and whose status column matched one of the
291 values provided. These name => value pairs are used more or less directly in
292 the DBIx::Class search() routine, so in most cases, you can use DBIx::Class
293 syntax to retrieve the user according to whatever rules you have.
295 NOTE: Because the password in most cases is encrypted - it is not used
296 directly but its encryption and comparison with the value provided is usually
297 handled by the Password Credential. Part of the Password Credential's behavior
298 is to remove the password argument from the authinfo that is passed to the
299 storage module. See L<Catalyst::Authentication::Credential::Password>.
301 One thing you need to know about this retrieval method is that the name
302 portion of the pair is checked against the user class's column list. Pairs are
303 only used if a matching column is found. Other pairs will be ignored. This
304 means that you can only provide simple name-value pairs, and that some more
305 advanced DBIx::Class constructs, such as '-or', '-and', etc. are in most cases
306 not possible using this method. For queries that require this level of
307 functionality, see the 'searchargs' method below.
309 =head2 Advanced Retrieval
311 The Searchargs and Resultset retrieval methods are used when more advanced
312 features of the underlying L<DBIx::Class> schema are required. These methods
313 provide a direct interface with the DBIx::Class schema and therefore
314 require a better understanding of the DBIx::Class module.
316 =head3 The dbix_class key
318 Since the format of these arguments are often complex, they are not keys in
319 the base authinfo hash. Instead, both of these arguments are placed within
320 a hash attached to the store-specific 'dbix_class' key in the base $authinfo
321 hash. When the DBIx::Class authentication store sees the 'dbix_class' key
322 in the passed authinfo hash, all the other information in the authinfo hash
323 is ignored and only the values within the 'dbix_class' hash are used as
324 though they were passed directly within the authinfo hash. In other words, if
325 'dbix_class' is present, it replaces the authinfo hash for processing purposes.
327 The 'dbix_class' hash can be used to directly pass arguments to the
328 DBIx::Class authentication store. Reasons to do this are to avoid credential
329 modification of the authinfo hash, or to avoid overlap between credential and
330 store key names. It's a good idea to avoid using it in this way unless you are
331 sure you have an overlap/modification issue. However, the two advanced
332 retrieval methods, B<searchargs> and B<resultset>, require its use, as they
333 are only processed as part of the 'dbix_class' hash.
339 The B<searchargs> method of retrieval allows you to specify an arrayref containing
340 the two arguments to the search() method from L<DBIx::Class::ResultSet>. If provided,
341 all other args are ignored, and the search args provided are used directly to locate
342 the user. An example will probably make more sense:
344 if ($c->authenticate(
346 password => $password,
349 searchargs => [ { -or => [ username => $username,
351 clientid => $clientid ]
353 { prefetch => qw/ preferences / }
358 # do successful authentication actions here.
361 The above would allow authentication based on any of the three items -
362 username, email, or clientid - and would prefetch the data related to that user
363 from the preferences table. The searchargs array is passed directly to the
364 search() method associated with the user_model.
368 The B<resultset> method of retrieval allows you to directly specify a
369 resultset to be used for user retrieval. This allows you to create a resultset
370 within your login action and use it for retrieving the user. A simple example:
372 my $rs = $c->model('MyApp::User')->search({ email => $c->request->params->{'email'} });
373 ... # further $rs adjustments
375 if ($c->authenticate({
376 password => $password,
377 'dbix_class' => { resultset => $rs }
379 # do successful authentication actions here.
382 Be aware that the resultset method will not verify that you are passing a
383 resultset that is attached to the same user_model as specified in the config.
385 NOTE: All of these methods of user retrieval, including the resultset method,
386 consider the first row returned to be the matching user. In most cases there
387 will be only one matching row, but it is easy to produce multiple rows,
388 especially when using the advanced retrieval methods. Remember, what you get
389 when you use this module is what you would get when calling
392 NOTE ALSO: The user info used to save the user to the session and to retrieve
393 it is the same regardless of what method of retrieval was used. In short,
394 the value in the id field (see 'id_field' config item) is used to retrieve the
395 user from the database upon restoring from the session. When the DBIx::Class storage
396 module does this, it does so by doing a simple search using the id field. In other
397 words, it will not use the same arguments you used to request the user initially.
398 This is especially important to those using the advanced methods of user retrieval.
399 If you need more complicated logic when reviving the user from the session, you will
400 most likely want to subclass the L<Catalyst::Authentication::Store::DBIx::Class::User> class
401 and provide your own for_session and from_session routines.
408 There are no publicly exported routines in the DBIx::Class authentication
409 store (or indeed in most authentication stores). However, below is a
410 description of the routines required by L<Catalyst::Plugin::Authentication>
411 for all authentication stores. Please see the documentation for
412 L<Catalyst::Plugin::Authentication::Internals> for more information.
415 =head2 new ( $config, $app )
417 Constructs a new store object.
419 =head2 find_user ( $authinfo, $c )
421 Finds a user using the information provided in the $authinfo hashref and
422 returns the user, or undef on failure. This is usually called from the
423 Credential. This translates directly to a call to
424 L<Catalyst::Authentication::Store::DBIx::Class::User>'s load() method.
426 =head2 for_session ( $c, $user )
428 Prepares a user to be stored in the session. Currently returns the value of
429 the user's id field (as indicated by the 'id_field' config element)
431 =head2 from_session ( $c, $frozenuser)
433 Revives a user from the session based on the info provided in $frozenuser.
434 Currently treats $frozenuser as an id and retrieves a user with a matching id.
438 Provides information about what the user object supports.
440 =head2 auto_update_user( $authinfo, $c, $res )
442 This method is called if the realm's auto_update_user setting is true. It
443 will delegate to the user object's C<auto_update> method.
445 =head2 auto_create_user( $authinfo, $c )
447 This method is called if the realm's auto_create_user setting is true. It
448 will delegate to the user class's (resultset) C<auto_create> method.
452 As of the current release, session storage consists of simply storing the user's
453 id in the session, and then using that same id to re-retrieve the user's information
454 from the database upon restoration from the session. More dynamic storage of
455 user information in the session is intended for a future release.
457 =head1 BUGS AND LIMITATIONS
459 None known currently; please email the author if you find any.
463 L<Catalyst::Plugin::Authentication>, L<Catalyst::Plugin::Authentication::Internals>,
464 and L<Catalyst::Plugin::Authorization::Roles>
468 Jason Kuri (jayk@cpan.org)
472 Copyright (c) 2007 the aforementioned authors. All rights
473 reserved. This program is free software; you can redistribute
474 it and/or modify it under the same terms as Perl itself.