[Catalyst] Can't locate Catalyst/Plugin/Authentication/Store/DBIC.pm

Jason Kohles email at jasonkohles.com
Wed Dec 19 21:47:33 GMT 2007


On Dec 18, 2007, at 2:04 AM, Michael Higgins wrote:

> On Mon, 17 Dec 2007 21:03:52 -0800
> Michael Higgins <linux at evolone.org> wrote:
>
>> On Mon, 17 Dec 2007 20:09:23 -0800
>> Michael Higgins <linux at evolone.org> wrote:
>>
>>> On Mon, 17 Dec 2007 20:47:20 -0700
>>> Jay K <jayk at ion0.com> wrote:
>>>
>>>> Hi Michael,
>>>>
>>>> Unfortunately the Tutorial is a bit out of date.
>
> [8<]
>
>> Do I go about redefining my 'roles' as '1', '2', '3'?? Or do I have  
>> to
>> change my database configuration?
>
> . . . [reply to self again]
>
> Okay, it appears as if the join table is no longer needed? (I don't
> know why it was needed before, but it's part of the tutorial, IIRC.)
>
> So, I have a table "users" and "user_roles". First table is user
> information with a user_id. Second table is user_id and role_name. My
> role_id column and 'roles' table are probably both superfluous now?
>
> __PACKAGE__->belongs_to(user => 'MyAppDB::Users', 'user_id');
>
> __PACKAGE__->has_many(map_user_roles => 'MyAppDB::UserRoles',
> 'user_id');
>
> Is that _really_ all that's required?
>
T
he way you had it will still work too, as long as you also have a  
many_to_many relationship that maps across the join table...

package MyAppDB::Role;
__PACKAGE__->columns(qw( id name ));

package MyAppDB::UserRole;
__PACKAGE__->belongs_to( 'user', 'MyAppDB::User', 'user_id' );
__PACKAGE__->belongs_to( 'role', 'MyAppDB::Role', 'role_id' );

package MyAppDB::User;
__PACKAGE__->has_many( 'map_user_roles', 'MyAppDB::UserRole',  
'user_id' );
__PACKAGE__->many_to_many( 'user_roles', 'map_user_roles', 'role' );

And then in your configuration...
authentication:
   realms:
     default:
       store:
         role_relation: user_roles
         role_field: name

As you can see, role_relation needs to be a relationship that returns  
MyAppDB::Role objects, if you tell it to use map_user_roles, it is  
going to get MyAppDB::UserRole objects instead, and role_field is the  
name of the field in MyAppDB::Role that contains the name of the role.

So when you say __PACKAGE__->assert_user_role(qw( admin ));

What's happening behind the scenes is something like this:

# These actually come from the configuration...
my $role_relation = 'user_roles';
my $role_field = 'name';
for my $role ( $c->user->$role_relation() ) {
     if ( $role->$role_field() eq 'admin' ) { return 1 }
}


-- 
Jason Kohles, RHCA RHCDS RHCE
email at jasonkohles.com - http://www.jasonkohles.com/
"A witty saying proves nothing."  -- Voltaire





More information about the Catalyst mailing list