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

Michael Higgins linux at evolone.org
Thu Dec 20 07:07:40 GMT 2007


On Wed, 19 Dec 2007 16:47:33 -0500
Jason Kohles <email at jasonkohles.com> wrote:

> 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 }
> }
> 
> 

Wow, thanks for that. There is no way I could have figured that out.

I'll keep this and revisit the files, I'm sure.

Cheers,

-- 
 |\  /|        |   |          ~ ~  
 | \/ |        |---|          `|` ?
 |    |ichael  |   |iggins    \^ /
 michael.higgins[at]evolone[dot]org



More information about the Catalyst mailing list