[Catalyst-dev] Implementing Authent/Author via attributes (RFC)

Bruce McKenzie brucem at dynamicrange.com
Sat Apr 4 01:22:10 GMT 2009


Sadly, it was not clear to me that you could have only one ActionClass  
per handler. I finally figured it out after tracing things and reading  
lots of perldoc. <sigh> I'm new to this. It worked fine for my paths  
that were not RESTful also :-)

I see the notes about a proposed patch (http://www.mail-archive.com/catalyst@lists.rawmode.org/msg04135.html 
) which redirected to a Grand Unified Theory of Rearchitecture  
(instead of applying the patch). Dumb question -- where can I read  
more about the rearchitecture?


Anyways, I have a real issue and a proposal --

So here's what I want to do:

--- Controller ---
...
sub config_element :Path('')  ActionClass('REST')  
ActionClass( 'LoginRequired' )
{
     my ( $self, $c ) = @_;

    $c->log->debug("I only get this if I'm logged in!");
}
...
------

--- MyApp::Action::LoginRequired ---
...
sub execute
{
     my $self = shift;
     my ( $controller, $c, @args ) = @_;

     if ( ! $c->session->{'logged_in'} )
     {
         $c->detach('/login_required');
     }

     my $r = $self->next::method(@_);

     return $r;
}
...
-------

Why? It just seemed way cleaner to me (LoginRequired *is* attribute-y  
to me :-) than repeated:
---
         $c->detach('/login_required') unless $c->session- 
 >{'logged_in'};
---

lines throughout all of my methods. Specifically, I added a "auth not  
required" mode in which login-requirements were temporarily defeated,  
and I had to go edit every path everywhere that had this code bit.  
Sure, I can turn "$c->session->{'logged_in'}" into a app/context  
method call and have the code only there...but it misses the point (or  
*I* miss the point).

Attributes are decorators and meta-behaviours, and access requirements  
seemed like a perfect example of this to me. Obviously they don't have  
to be ActionClass(es).

So (he says, phrasing it in the form of an RFC), would there be any  
traction in pursuing a Auththent/Author/ACL attribute that slots in?

Something like:

sub mypath1 : AllowWhen( 'authenticated' ) { }
sub mypath2 : AllowWhen( 'hasanyrole(foo,bar)' ) { }  # permitted if  
user has any of the roles
sub mypath3 : AllowWhen( 'hasallroles(organization1,administration)' )  
{ }   # permitted if user has all of the roles

May I have feedback (up to and hopefully not including "please go  
away" :-)

Thanks very much for your time.

Bruce


---
Bruce McKenzie
brucem at dynamicrange.com



-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.scsys.co.uk/pipermail/catalyst-dev/attachments/20090403/589ae3c3/attachment-0001.htm


More information about the Catalyst-dev mailing list