[Catalyst] Question on user role management
Jason Galea
lists at eightdegrees.com.au
Tue May 17 14:05:28 GMT 2011
Hi Adam,
have you tried using the roles method on the other users?
my $user = $c->stash->{users_rs}->find({ uniqid => $uniqid });
die "No such user: $uniqid\n" if (!$user);
my @roles = $user->roles;
do you have a many_to_many defined in your user table class? eg
__PACKAGE__->has_many(user2role_maps => 'MyApp::DB::Result::User2Role', 'user');
__PACKAGE__->many_to_many(roles => 'user2role_maps', 'role');
I'm guessing you do as c.user.roles works..
cheers,
J
On Tue, May 17, 2011 at 11:10 AM, Adam Jimerson <vendion at gmail.com> wrote:
> I am trying to come up with a way to manage roles for users in my Catalyst
> app, I have a database structure much like what is used in Chapter 5 of the
> Catalyst::Manual::Tutorial
> <http://search.cpan.org/~bobtfish/Catalyst-Manual-5.8007/lib/Catalyst/Manual/Tutorial/05_Authentication.pod>
> where I have a user table, a role table, and and a usertorole table. I am
> trying to find a way to get a list of roles for a user to be able to make
> changes, add new roles and/or remove roles from the user. I have both
> authentication and authorization working in my app and I can fetch the roles
> for the user currently logged in by
> <ul>
> [% FOR role = c.user.roles %]<li>[% role %]</li>[% END %]
> </ul>
> But when I try to get a list from a different user it doesn't work as
> expected, here is what I am currently doing
>
> sub base : Chained('/'): PathPart('admin') :CaptureArgs(0) {
> my ( $self, $c ) = @_;
>
> $c->stash( users_rs => $c->model('DB::User'));
> $c->stash( role_rs => $c->model('DB::Role'));
> $c->stash( usertorole_rs => $c->model('DB::Userstorole'));
> }
>
> sub user : Chained('base'): CaptureArgs(1) {
> my ( $self, $c, $uniqid ) = @_;
>
> if ( $uniqid == m/[^0-9]/ ) {
> die "The ID number is not numeric\n";
> }
> my $user = $c->stash->{users_rs}->find({ uniqid => $uniqid });
> die "No such user: $uniqid\n" if (!$user);
> my $roles = $c->stash->{usertorole_rs}->search(
> undef,
> {
> where => { 'userid', $uniqid }
> },
> );
> warn "No such role: $uniqid\n" if (!$roles);
> $c->stash(user => $user,
> roles => $roles);
> }
>
> [% FOR role IN roles %]
> <tr><td>Role #:</td><td>Role [% role.role %] Role ID [% role.roleid %]
> User id [% role.userid %]</td></tr>
> [% END %]
>
> My database schema is so
>
> CREATE TABLE roles (
> uniqid integer NOT NULL,
> role character varying(32) NOT NULL
> );
>
> CREATE TABLE users (
> uniqid integer NOT NULL,
> username character varying(20) NOT NULL,
> password character varying(40) NOT NULL,
> firstname character varying(20) NOT NULL,
> lastname character varying(20) NOT NULL,
> email character varying(20) NOT NULL,
> active boolean DEFAULT true NOT NULL,
> created timestamp without time zone DEFAULT now() NOT NULL
> );
>
> CREATE TABLE userstoroles (
> userid integer NOT NULL,
> role integer NOT NULL
> );
>
> Am I going about this the wrong way or is there something that I am over
> looking?
>
> _______________________________________________
> 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@lists.scsys.co.uk/
> Dev site: http://dev.catalyst.perl.org/
>
>
More information about the Catalyst
mailing list