[erlang-questions] Declarative Security in Erlang

Tim Watson watson.timothy@REDACTED
Mon May 21 22:47:58 CEST 2012


On 21/05/2012 21:22, Andrew Berman wrote:
> Cool, thanks Tim.  I am using a before_advice since it is only 
> security.  I figured that your two suggestions are the best way to do 
> it.  As you said, passing around the user is the purest way, so I'll 
> probably just go with that method.  I like your suggestion of passing 
> in the index of the user record in the inputs.
>
> I was planning on using a gen_server and every time a function is 
> accessed it creates a new process which stores the user.  I feel like 
> this could get messy though.
>
> Thanks again for the annotations project, I love it!
>
Cool, glad you're enjoying it! So on the production code, this would 
look something like:

-requires_authorisation({user_record_index, 1}).
read_user_info(User, InfoType) ->
     db:fetch(user_info, User, InfoType).

That seems reasonable to me. If all the functions in a module place the 
user argument in the same position, it ought to be possible to annotate 
a module so that *all* exported functions are annotated - for something 
like this it'd make life easier to just say:

%%%
-module(user_db).
-include_lib("annotations/include/annotation.hrl").

-requires_authorisation([{scope, user}, {arg_index, 1}]).

%%%

In theory, that should work OOTB today, although I'm not 100% about the 
module level stuff as I've mainly focused on testing (and using) the 
function level annotations.

> --Andrew
>
> On Mon, May 21, 2012 at 1:04 PM, Tim Watson <watson.timothy@REDACTED 
> <mailto:watson.timothy@REDACTED>> wrote:
>
>     Holy crap the indentation on that post got screwed somehow. Allow
>     me to tidy up a bit.....
>
>
>     around_advice(#annotation{data={mode, pdict}}, M, F, Inputs) ->
>        case get(current_user) of
>            undefined ->
>                handle_restricted(M, F, Inputs);
>            #user{} ->
>                annotation:call_advised(M, F, Inputs)
>        end.
>
>     around_advice(#annotation{data={user_record_idx, Idx}}, M, F,
>     Inputs) ->
>        User = lists:nth(Idx, Inputs),
>        case check(User) of
>            restricted ->
>                handle_restricted(M, F, Inputs);
>            ok ->
>                annotation:call_advised(M, F, Inputs)
>        end.
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20120521/7469545e/attachment.htm>


More information about the erlang-questions mailing list