We do it very similarly in InfoGrid.
But we can go one big step further: have InfoGrid automatically enforce the access control rules that were set up. If we have the ACL information, why not use it and have the graph database do the enforcement for us? That functionality has been part of InfoGrid for a couple of years.
Here’s the basic idea. (again, paraphrasing the code for easier readability. Consult the above link for full code.) When a graph database in InfoGrid is configured to run with a AclBasedAccessManager, we can do this:
First, we need a MeshObject that is going to be the owner of some access-controlled data object. Any MeshObject will do:
MeshObject owner = createMeshObject();
Then, we associate the owner with the current Thread. (Just like in UNIX, where the ownership of processes determines what the process can do)
theAccessManager.setCaller( owner );
Now here comes the access-controlled data object.
MeshObject data = createMeshObject();
Because the current Thread is associated with the owner MeshObject, InfoGrid automatically sets up an ownership relationship between the data object and the owner object — just like in UNIX, a newly created file automatically has an owner.
Going beyond UNIX, we can now put the data object into something we call a ProtectionDomain. It’s basically a collection of MeshObjects that all have the same access control policy. This is mainly for efficiency and easy of management.
MeshObject protectionDomain = createMeshObject( AclBasedSecuritySubjectArea.PROTECTIONDOMAIN ); domain.relateAndBless( AclBasedSecuritySubjectArea.PROTECTIONDOMAIN_GOVERNS_MESHOBJECT.getSource(), dataObject );
Now, let’s give some another entity some access rights to the data object:
MeshObject actorMayReadNotWrite = createMeshObject(); actorMayReadNotWrite.relateAndBless( AclBasedSecuritySubjectArea.MESHOBJECT_HASREADACCESSTO_PROTECTIONDOMAIN.getSource(), domain );
Note that it is the owner of the object that needs to do that; others can’t.
So now we change ownership on the thread.
theAccessManager.setCaller( actorMayReadNotWrite );
This call will succeed:
dataObject.getPropertyValue( <some property type> );
while this call will throw a NotPermittedException:
dataObject.setPropertyValue( <some property type>, <some property value> )
If the thread was currently associated with the owner, both calls would succeed. Again, I refer you to the follow code linked above. As you can say, it works very similar to how permissions work in UNIX, although of course the underlying ACL information is represented as a MeshObjectGraph.
If you like this, we can do even one better: the whole security mechanism is pluggable in InfoGrid. You don’t like the way we represent and enforce ACLs? Be our guest … write a new subclass of AccessManager, and it will work the way you want. (Did we say that InfoGrid is extremely pluggable?)
P.S. It’s great to see that we aren’t the only ones to think that security-related information is an excellent match for a graph database. There’s also the rather intriguing example for where Microsoft is going with their LDAP directory, which very much looks like evolution in the graph direction. Time to get on board graph databases!