[cgiapp] Security, Authentication and Authorization for CGI::App

Brad Van Sickle bvansickle3 at gmail.com
Thu Mar 4 10:56:17 EST 2010


I'd like to get the list's opinion on some security practices for 
CGI::Application.

In a lot of my applications I'm noticing that I need to "secure" things 
at many different levels and this is resulting in me having a security 
infrastructure that is very spread out and hard to manage/change.  

Specifically, I need to be aware of the following things when 
implementing security:
1) Authentication - figuring out who the user is and if they have access 
to app at all
2) Runmode Authorization - figuring out of the user has access to 
perform the specific function they are requesting
3) Data authorization.  - In quite a few apps I'm noticing the need to 
allow multiple users or user types to have access to the same runmode, 
but I need to show them a specific set of information based on who they 
are.  Example, I may have a end user role tied to an organization and a 
management user role, who has permission to see and manage data for a 
group of those organizations so I need to adjust the data output 
accordingly.

The way I handle that today is:
1) Authentication is pretty simple, I have a "Security" application that 
provides the login form, processes the login, hands out the session and 
then redirects the user to the actual app.
2) Runmode authorization is a little trickier, but still manageable.  I 
check the user's session in prerun and if they are not authenticated, 
redirect to a "not authorized" runmode that redirects them back to the 
security app (login page) Any module that needs to set security on 
specific runmodes, inherits prerun and does "if" checks against the 
runmode/usertype to make sure they are authorized.  Anyone trying to go 
somewhere they shouldn't is redirected to that same "not authorized" 
runmode.  
3) Data authorization is the part I'm least happy with.  I often find 
myself pulling keys (groupID, organizationID, etc..) out of the user 
profile, doing an "if" check on user type, and then dynamically setting 
WHERE clauses on my DB queries according to what user type I'm dealing 
with and what information they are allowed to see.  It's cumbersome and 
hard to manage.

My problems with my current approach:
1) This seems to work ok.
2) My authorization scheme works, but doing things like adding new user 
roles, changing permissions, etc... can get messy and I feel there is 
probably a better way.  I'd love to be able to "ask" my security 
application who this person is and if they are allowed where they want 
to go.  I think there are modules that do this to at least some extent, 
but I still have to keep that list somewhere and not sure just moving 
it's location makes things easier.
3) As I mentioned, my data authorization scheme is very hard to manage 
and I'd love to find a better way.  I just don't have any ideas about 
what that "better way" is.  Obviously it's easier to do some query 
alteration to display different data than to write entirely new 
applications or modules to cater to different user types/access levels, 
but when requirements change, new user types are added, etc... it can be 
a considerable amount of work to alter all the "if" checks on the 
queries accordingly.  This is also notoriously difficult to test for, 
because of the sheer volume of test cases.

I apologize for the extreme length of this, but I wanted to give a good 
overview of what I'm doing today and see if any of the smarter, more 
experienced members of the list might be able to give me any suggestions 
about how to make my security more modular/portable and easier to manage.

Thanks






More information about the cgiapp mailing list