use strict;
use warnings;
+use Data::Dumper;
use base qw/Catalyst::Authentication::User/;
use base qw/Class::Accessor::Fast/;
bless $self, $class;
-
+ ## Note to self- add handling of multiple-column primary keys.
if (!exists($self->config->{'id_field'})) {
my @pks = $self->{'resultset'}->result_source->primary_columns;
if ($#pks == 0) {
Catalyst::Exception->throw("user table does not contain a single primary key column - please specify 'id_field' in config!");
}
}
+ if (not $self->{'resultset'}) {
+ Catalyst::Exception->throw("\$c->model('${ \$self->config->{user_class} }') did not return a resultset. Did you set user_class correctly?");
+ }
if (!$self->{'resultset'}->result_source->has_column($self->config->{'id_field'})) {
Catalyst::Exception->throw("id_field set to " . $self->config->{'id_field'} . " but user table has no column by that name!");
}
$searchargs->{$key} = $authinfo->{$key};
}
}
- $self->_user($self->resultset->search($searchargs)->first);
+ if (keys %{$searchargs}) {
+ $self->_user($self->resultset->search($searchargs)->first);
+ } else {
+ Catalyst::Exception->throw("User retrieval failed: no columns from " . $self->config->{'user_class'} . " were provided");
+ }
}
if ($self->get_object) {
if (exists($self->config->{'role_column'})) {
my $role_data = $self->get($self->config->{'role_column'});
if ($role_data) {
- @roles = split /[ ,\|]+/, $self->get($self->config->{'role_column'});
+ @roles = split /[\s,\|]+/, $self->get($self->config->{'role_column'});
}
$self->_roles(\@roles);
} elsif (exists($self->config->{'role_relation'})) {
sub for_session {
my $self = shift;
- return $self->get($self->config->{'id_field'});
+ #return $self->get($self->config->{'id_field'});
+
+ #my $frozenuser = $self->_user->result_source->schema->freeze( $self->_user );
+ #return $frozenuser;
+
+ my %userdata = $self->_user->get_columns();
+ return \%userdata;
}
sub from_session {
my ($self, $frozenuser, $c) = @_;
- # this could be a lot better. But for now it just assumes $frozenuser is an id and uses find_user
- # XXX: hits the database on every request? Not good...
- return $self->load( { $self->config->{'id_field'} => $frozenuser }, $c);
+ #my $obj = $self->resultset->result_source->schema->thaw( $frozenuser );
+ #$self->_user($obj);
+
+ #if (!exists($self->config->{'use_userdata_from_session'}) || $self->config->{'use_userdata_from_session'} == 0) {
+# $self->_user->discard_changes();
+# }
+#
+# return $self;
+#
+## if use_userdata_from_session is defined in the config, we fill in the user data from the session.
+ if (exists($self->config->{'use_userdata_from_session'}) && $self->config->{'use_userdata_from_session'} != 0)
+ {
+ my $obj = $self->resultset->new_result({ %$frozenuser });
+ $obj->in_storage(1);
+ $self->_user($obj);
+ return $self;
+ } else {
+ my $id;
+ if (ref($frozenuser) eq 'HASH') {
+ $id = $frozenuser->{$self->config->{'id_field'}};
+ } else {
+ $id = $frozenuser;
+ }
+ return $self->load( { $self->config->{'id_field'} => $id }, $c);
+ }
}
sub get {
}
sub get_object {
- my $self = shift;
+ my ($self, $force) = @_;
+ if ($force) {
+ $self->_user->discard_changes;
+ }
+
return $self->_user;
}
sub obj {
- my $self = shift;
+ my ($self, $force) = @_;
- return $self->get_object;
+ return $self->get_object($force);
}
sub auto_create {
=head2 for_session
-Returns a serialized user for storage in the session. Currently, this is the value of the field
-specified by the 'id_field' config variable.
+Returns a serialized user for storage in the session.
=head2 from_session
-Revives a serialized user from storage in the session. Currently, this uses the serialized data as the
-value of the 'id_field' config variable.
+Revives a serialized user from storage in the session.
=head2 get ( $fieldname )