It’s fairly obvious how to model a database table that would act as an access control list (ACL) when you’re just dealing with discrete users who have some level of access to a discrete resource. Something like this:
TABLE acl (
user_id INT,
resource_id INT,
access_type INT
)
… where access_type is a number representing something like:
0 (or lack of record for user_id and resource_id) means no access
1 means read-only
2 means full control
However it starts getting trickier when you’ve got scenarios like users can be a member of one or more groups and groups can contain other groups. Then a resource could be a folder that contains other resources.
Other than the obviously poor approach of doing a whole bunch of recursive queries at runtime to determine the level of access a user should have to a resource, how do these scenarios tend to get handled? Are there commonly-accepted designs for modelling an ACL like this?
Are you using a DB with support for
connect by, or something similar?In oracle, I’ve implemented the following.
then use
connect byto get all child groups for userThis query will get all the groups that were assigned to the user in
userGroupand all the child groups assigned to the groups that the user belongs to.