<tt><font size=2>Perhaps I'm missing something but...</font></tt>
<br>
<br><tt><font size=2>&quot;how requires_login/requires_role would store
the fact that the provided sub requires auth&quot;</font></tt>
<br>
<br><tt><font size=2>Simple implementation:</font></tt>
<br>
<br><tt><font size=2># given has_role<b> is calculable </b></font></tt>
<br>
<br><tt><font size=2>sub requires_role { </font></tt>
<br><tt><font size=2>&nbsp; &nbsp; &nbsp; &nbsp; my ($role, $code,
$handle_exception) = @_;</font></tt>
<br><tt><font size=2>&nbsp; &nbsp; &nbsp; &nbsp; return sub {</font></tt>
<br><tt><font size=2>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; if (has_role($role)){</font></tt>
<br><tt><font size=2>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $code-&gt;(@_);</font></tt>
<br><tt><font size=2>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; }</font></tt>
<br><tt><font size=2>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; else{</font></tt>
<br><tt><font size=2>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (defined $handle_exception){</font></tt>
<br><tt><font size=2>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; $handle_exception-&gt;($role, @_)</font></tt>
<br><tt><font size=2>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</font></tt>
<br><tt><font size=2>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else {</font></tt>
<br><tt><font size=2>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; default_403_no_role($role, @_)</font></tt>
<br><tt><font size=2>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</font></tt>
<br><tt><font size=2>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; }</font></tt>
<br><tt><font size=2>&nbsp; &nbsp; &nbsp; &nbsp; }</font></tt>
<br><tt><font size=2>}</font></tt>
<br>
<br><tt><font size=2>Complex implementation:</font></tt>
<br>
<br><tt><font size=2>requires_login and requires_role return objects which
have metadata about their requirements and exception handling which can
be changed easily, but that overload as coderefs to something like the
code above.</font></tt>
<br>
<br>
<br>
<br>
<br><font size=1 color=#5f5f5f face="sans-serif">From: &nbsp; &nbsp; &nbsp;
&nbsp;</font><font size=1 face="sans-serif">David Precious &lt;davidp@preshweb.co.uk&gt;</font>
<br><font size=1 color=#5f5f5f face="sans-serif">To: &nbsp; &nbsp; &nbsp;
&nbsp;</font><font size=1 face="sans-serif">dancer-users@dancer.pm</font>
<br><font size=1 color=#5f5f5f face="sans-serif">Date: &nbsp; &nbsp; &nbsp;
&nbsp;</font><font size=1 face="sans-serif">11/12/2012 11:25</font>
<br><font size=1 color=#5f5f5f face="sans-serif">Subject: &nbsp; &nbsp;
&nbsp; &nbsp;</font><font size=1 face="sans-serif">[dancer-users]
Dancer::Plugin::Auth::Extensible - possible backwards-incompatible change</font>
<br><font size=1 color=#5f5f5f face="sans-serif">Sent by: &nbsp; &nbsp;
&nbsp; &nbsp;</font><font size=1 face="sans-serif">dancer-users-bounces@dancer.pm</font>
<br>
<hr noshade>
<br>
<br>
<br><tt><font size=2><br>
Hi all,<br>
<br>
Whilst I really like the (ab)use of subroutine attributes for denoting<br>
which routes require authentication/specific roles, some people (whose<br>
opinions I respect) have tried to convince me that this is a Bad Idea,<br>
and is likely to be fragile.<br>
<br>
One particularly good point made is that the current implementation<br>
stores the attributes for a given route handler by the refaddr, which<br>
could be problematic if run under threads (not sure if anyone really<br>
does that, though). &nbsp;Classes can provide a CLONE method to work around<br>
this, but I don't think that'll work in this case.<br>
<br>
One suggestion was to provide a new keyword, e.g. requires_auth, which<br>
would work something like:<br>
<br>
 &nbsp; &nbsp;get '/secret' =&gt; requires_login(sub { .... });<br>
 &nbsp; &nbsp;<br>
 &nbsp; &nbsp;get '/beer' &nbsp; =&gt; requires_role('BeerDrinker', sub
{ ... });<br>
<br>
(Something along those lines, at least.) &nbsp;I'm certain how I would<br>
implement it, though - i.e. how requires_login/requires_role would<br>
store the fact that the provided sub requires auth, without the same<br>
thread safety issues of using refaddr.<br>
<br>
Perhaps detecting the use of threads and refusing to continue would be<br>
one way of dealing with it :)<br>
<br>
Opinions on this would be very welcome.<br>
<br>
<br>
<br>
-- <br>
David Precious (&quot;bigpresh&quot;) &lt;davidp@preshweb.co.uk&gt;<br>
</font></tt><a href=http://www.preshweb.co.uk/><tt><font size=2>http://www.preshweb.co.uk/</font></tt></a><tt><font size=2>
&nbsp; &nbsp; </font></tt><a href=www.preshweb.co.uk/twitter><tt><font size=2>www.preshweb.co.uk/twitter</font></tt></a><tt><font size=2><br>
</font></tt><a href=www.preshweb.co.uk/linkedin><tt><font size=2>www.preshweb.co.uk/linkedin</font></tt></a><tt><font size=2>
&nbsp; &nbsp;</font></tt><a href=www.preshweb.co.uk/facebook><tt><font size=2>www.preshweb.co.uk/facebook</font></tt></a><tt><font size=2><br>
</font></tt><a href=www.preshweb.co.uk/cpan><tt><font size=2>www.preshweb.co.uk/cpan</font></tt></a><tt><font size=2>
&nbsp; &nbsp; &nbsp; &nbsp;</font></tt><a href=www.preshweb.co.uk/github><tt><font size=2>www.preshweb.co.uk/github</font></tt></a><tt><font size=2><br>
<br>
<br>
_______________________________________________<br>
dancer-users mailing list<br>
dancer-users@dancer.pm<br>
</font></tt><a href="http://lists.preshweb.co.uk/mailman/listinfo/dancer-users"><tt><font size=2>http://lists.preshweb.co.uk/mailman/listinfo/dancer-users</font></tt></a><tt><font size=2><br>
</font></tt>
<br>