Catalyst::TraitFor::Model::DBIC::Schema::WithCurrentUser
package MyApp::Model::DB; use Moose; extends qw/Catalyst::Model::DBIC::Schema/; __PACKAGE__->config({ traits =>['WithCurrentUser'], # The important bit! schema_class => 'MyApp::Schema', connect_info => { dsn => 'dbi:SQLite:dbname=:memory:' }, }); 1; ... package MyApp::Schema; use Moose; extends qw/DBIx::Class::Schema/; has 'current_user' => ( is => 'rw', ); # This is all you have to add to # the schema __PACKAGE__->load_namespaces; 1;
This is a trait for a Catalyst::Model::DBIC::Schema object. All you need to do is add a current_user to your schema, and then use the role in your Model::DB.
This module makes it easy to have a "pre-authorized" schema and resultsets by using DBIx::Class::Schema::RestrictWithObject. Here's a real example:
package MyApp::Schema; use Moose; use List::MoreUtils qw/any/; extends 'DBIx::Class::Schema'; has current_user => ( is => 'rw' ); __PACKAGE__->load_components(qw/Schema::RestrictWithObject/); __PACKAGE__->load_namespaces; around resultset => sub { my ( $orig, $self ) = ( shift, shift ); my $new_rs = $self->$orig(@_); if ( any { $new_rs->result_source->source_name eq $_ } qw/Blog Comment Message/ ) { my $schema = $self->restrict_with_object( $self->resultset('Restrictions')->first ); # This is a resultset # that has methods for # restricting everything # in @resultsets_to_restrict; # see below my $restrictor = "restrict_${\$new_rs->result_source->source_name}_resultset"; # This # is the # method # we will call # in our # Restrictions # resultset. if ( $schema->restricting_object && $schema->restricting_object->can($restrictor) ) { $new_rs = $schema->restricting_object->$restrictor($new_rs); } } # So, here we restrict the # schema with a resultset # returned from our restrictor # generator. return $new_rs; }; 1;
Here is an example of what can go on in MyApp::Schema::Result::Restriction:
package MyApp::Schema::Result::Restriction; use Moose; use List::MoreUtils qw/any/; use Method::Signatures::Simple; extends 'DBIx::Class::Core'; __PACKAGE__->table("restriction"); __PACKAGE__->add_columns( "approved", ... "approved_by", ... "approved_at", ... "item", ... ); __PACKAGE__->set_primary_key("item"); __PACKAGE__->might_have( "blog", ... ); __PACKAGE__->might_have( "comment", ... ); __PACKAGE__->might_have( "message", ... ); method restrict_Blog_resultset($rs) { return $self->restriction( "blog", $rs ); } method restrict_Comment_resultset($rs) { return $self->restriction( "comment", $rs ); } method restrict_Message_resultset($rs) { return $self->restriction( "message", $rs ); } method restriction( $table, $rs ) { return $self->result_source->schema ->resultset('Restriction') ->related_resultset($table) unless $self->result_source->schema->current_user; # Return a restricted # rs if no user. return $rs if any { $_ =~ /admin/ } $self->result_source->schema->current_user->roles; # Return an unrestricted # rs if user is an admin return $self->result_source->schema ->resultset('Restriction') ->related_resultset($table); # Return a restricted # rs if user is not an # admin. } 1;
That's about it!
Amiri Barksdale <amiri@roosterpirates.com>
Matt S. Trout (mst) <mst@shadowcat.co.uk>
Tomas Doran (t0m) <bobtfish@bobtfish.net>
DBIx::Class::Schema::RestrictWithObject, DBIx::Class, Catalyst::Model::DBIC::Schema
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
To install Catalyst::TraitFor::Model::DBIC::Schema::WithCurrentUser, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Catalyst::TraitFor::Model::DBIC::Schema::WithCurrentUser
CPAN shell
perl -MCPAN -e shell install Catalyst::TraitFor::Model::DBIC::Schema::WithCurrentUser
For more information on module installation, please visit the detailed CPAN module installation guide.