[Catalyst] "no role configuration found" -- authorization: dbic and DBI::Schema::Loader

Ashley Pond V apv at sedition.com
Mon Dec 17 06:49:44 GMT 2007


Thanks for still looking at this, Jay. This is the top of the method  
with some "die" decoration:

Take 1:
     my ( $self, $c ) = @_;
     die "This will die";
     $c->assert_user_roles("no such role");

Take 2:
     my ( $self, $c ) = @_;
     $c->assert_user_roles("no such role");
     die "This will not fire";

I can put the assert in an eval block but $@ is not set so it doesn't  
help to see what's happening. There is no information in the logs at  
the point the code fails.

I guess I'll ask our admin to pull  
Catalyst::Plugin::Authentication::Store::DBIx::Class, yeah?  
Authentication is working fine, by the by. It's just Authorization  
that's wonky right now.

Pasting my setup stuff below.

-Ashley
-- 

use Catalyst qw/
     ConfigLoader
     -Debug
     Unicode
     StackTrace
     Static::Simple
     Authentication
     Authorization::Roles
     Session
     Session::Store::FastMmap
     Session::State::Cookie
/;
----------------
...User.pm

__PACKAGE__->has_many(
   "user_roles",
   "MyApp::Schema::UserRole",
   { "foreign.user" => "self.id" },
);


# Created by DBIx::Class::Schema::Loader v0.04004 @ 2007-12-16 13:36:55
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:qroNdEXQL4pOH80kVPQquw

__PACKAGE__->many_to_many(roles => 'user_roles', 'name');
---------------
yml
authentication:
   default_realm: users
   realms:
     users:
       credential:
         class: Password
         password_type: hashed
         password_hash_type: SHA-1
       store:
         class: DBIx::Class
         user_class: User
         role_relation: roles
         role_field: name

# doesn't matter whether or not the authorization stuff is there but  
this is what i've played with (and *many* permutations of the arguments)

authorization:
   dbic:
     role_class: Role
     role_field: name
     user_class: User
     user_field: user
     user_role_user_field: user
     user_role_role_field: role
     role_rel: user_roles
     user_role_class: UserRole



On Dec 16, 2007, at 9:20 PM, Jay K wrote:

> Hi Ashley,
>
> The log message you see is a result of the recent move away from  
> the Catalyst::Plugin::Authentication namespace for stores /  
> credentials.
>
> It falls back to the old naming and warns if it can't find the new  
> module.. It should, however, have no effect on the functionality of  
> the code.
>
> It's not a bad idea to update the DBIx::Class store - but be sure  
> to remove the Catalyst::Plugin::Authentication::Store::DBIx::Class  
> module first - just to avoid conflicts.  Nothing has changed  
> related to roles in the update, so it shouldn't make any difference.
>
> I don't know why the assert is failing, it should not - what do you  
> get if you use $c->check_user_roles() - valid results?
>
> Jay
>
>
> On Dec 16, 2007, at 4:27 PM, Ashley Pond V wrote:
>
>> Continuing saga. So I set up the many_to_many and lo! It worked.  
>> But it worked with *any* role, even fake ones, so obviously  
>> something was bad. Turned out that it was silently failing instead  
>> of throwing an access exception (but there was a template set by  
>> the namespace so the page rendered as expected).
>>
>>  # failed silently (as far as Cat was concerned)
>>  $c->assert_user_roles("there is no role called this");
>>
>> So, dug into the log:
>>
>> [Sun Dec 16 16:13:20 2007] [error] [client 67.170.68.172] [warn]  
>> Store class "Catalyst::Authentication::Store::DBIx::Class" not  
>> found, trying deprecated ::Plugin:: style naming. , referer: [...]
>>
>> Would love to have more, rather than fewer exceptions thrown. I  
>> think the missing class was the cause of a couple of red herrings  
>> I followed down the rabbit hole trying to get this running  
>> yesterday [I'm entitled to mix metaphors, I pay an annual fee].  
>> After I get an admin to install the missing package in the morning  
>> I'll regale you with my next series of missteps and annoying  
>> language.
>>
>> Live free or die early, die often,
>> -Ashley
>>
>> On Dec 15, 2007, at 9:52 PM, Jay K wrote:
>>
>>> Hi There Ashley,
>>>
>>> The DBIx::Class module expects to use the relation provided in  
>>> the role_relation config element to retrieve one or more rows,  
>>> which must contain a field called by whatever you provide in  
>>> role_field.
>>>
>>> My guess is that your user_roles table is a cross-ref table -  
>>> userid and roleid essentially.  In order to solve this you need  
>>> to use a many_to_many relationship mapping to the textual role  
>>> names.
>>>
>>> The DBIx::Class module expects you are going to route it to the  
>>> information it needs using the role_relation.  So what you really  
>>> need to do is create the schema class and just define the many-to- 
>>> many for roles.   Then provide that relation to 'role_relation'  
>>> and all your problems should go away.
>>>
>>> It still works with dynamic schema - but you have to create the  
>>> relationship.  You can do that by creating your schema module to  
>>> look something like this:
>>>
>>> package MyApp::Schema::Users;
>>> use strict;
>>> use warnings;
>>>
>>> use base 'DBIx::Class';
>>> __PACKAGE__->load_components("PK::Auto", "Core");
>>>
>>>
>>> __PACKAGE__->has_many('roles_map', "MyApp::Schema::RoleMap",  
>>> user_id');
>>> __PACKAGE__->many_to_many( roles => 'role_map, 'role');
>>>
>>> 1;
>>>
>>> I might have that slightly wrong - I've been moving today so I'm  
>>> a bit overtired.  but basically that allows your schema to  
>>> dynamically figure itself out, but you define the relationships  
>>> for it.
>>>
>>> For some database types, DBIx::Class can figure out your  
>>> relationships for you - but I don't think it can sort out many-to- 
>>> many's anyway.
>>>
>>> Hope that helps.  And I hope it makes as much sense to you as I  
>>> make to myself in my head at the moment.   This, I understand,  
>>> may not be the case.  If not, I'll try again tomorrow.
>>>
>>> Jay
>>>
>>> On Dec 15, 2007, at 5:57 PM, Ashley Pond V wrote:
>>>
>>>> Progressing… Looking at Catalyst/Plugin/Authentication/Store/ 
>>>> DBIC/User.pm I saw a couple of items in the "authentication"  
>>>> config I could set. With "role_relation" and "role_field" set--
>>>>
>>>> authentication:
>>>> default_realm: users
>>>> realms:
>>>>   users:
>>>>     credential:
>>>>       class: Password
>>>>       password_field: password
>>>>       password_type: hashed
>>>>       password_hash_type: SHA-1
>>>>     store:
>>>>       class: DBIx::Class
>>>>       user_class: User
>>>>       role_relation: user_roles
>>>>       role_field: role
>>>>
>>>> --I now get the roles checked but they are failing because they  
>>>> are checking (returning) the role "id" instead of the "name."
>>>>
>>>> $c->user->roles returns a list of the IDs too. So, from reading  
>>>> this,
>>>>    Catalyst::Plugin::Authentication::Store::DBIx::Class::roles()
>>>> it looks like dynamic loader schemas are incompatible right now?  
>>>> I'm trying to figure this out but there is a lot of inter- 
>>>> related code to read, cross-package-configuration, and  
>>>> documentation drift/lag.
>>>>
>>>> Throw me a bone, er, a line!
>>>> -Ashley
>>>>
>>>>
>>>> On Dec 15, 2007, at 10:18 AM, Ashley Pond V wrote:
>>>>> Can you elaborate? "map_user_role" ne "user_role." I have  
>>>>> "role_rel" set to the UserRole class. I tried adding  
>>>>> "user_role" but it didn't help and I don't see it anywhere in  
>>>>> the docs.
>>>>>
>>>>> I should rephrase, I think. Is anyone using  
>>>>> DBIC::Schema::Loader dynamically with role authorization? If  
>>>>> so, please share your configuration or advise of which FMTR.
>>>>>
>>>>> Thanks again,
>>>>> -Ashley
>>>>>
>>>>
>>>> _______________________________________________
>>>> List: Catalyst at lists.scsys.co.uk
>>>> Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/ 
>>>> catalyst
>>>> Searchable archive: http://www.mail-archive.com/ 
>>>> catalyst at lists.rawmode.org/
>>>> Dev site: http://dev.catalyst.perl.org/
>>>
>>> ---
>>> For most things, throwing yourself at the wall over and over is a  
>>> better way to improve than thinking hard about the wall and  
>>> taking pictures of it.  -- D.Litwack
>>>
>>>
>>>
>>> _______________________________________________
>>> List: Catalyst at lists.scsys.co.uk
>>> Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
>>> Searchable archive: http://www.mail-archive.com/ 
>>> catalyst at lists.rawmode.org/
>>> Dev site: http://dev.catalyst.perl.org/
>>
>>
>> _______________________________________________
>> List: Catalyst at lists.scsys.co.uk
>> Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
>> Searchable archive: http://www.mail-archive.com/ 
>> catalyst at lists.rawmode.org/
>> Dev site: http://dev.catalyst.perl.org/
>
> ---
> "Those who can make you believe absurdities can make you commit  
> atrocities." --Voltaire
>
>
>
> _______________________________________________
> List: Catalyst at lists.scsys.co.uk
> Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
> Searchable archive: http://www.mail-archive.com/ 
> catalyst at lists.rawmode.org/
> Dev site: http://dev.catalyst.perl.org/




More information about the Catalyst mailing list