Can't all the ACL filtering be done when initially loading the object from the Session/Cache/DB but before the object is part of a transaction?
> -----Original Message----- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] On Behalf Of > Andy Depue > Sent: Wednesday, February 09, 2005 3:23 PM > To: acegisecurity-developer@lists.sourceforge.net > Subject: Re: [Acegisecurity-developer] PostInvocation and Hibernate > Sessions > > We developed our current ACL type system before Acegi had its ACL system, > and > planned for this behavior from the beginning (we work with Hibernate as > well). Our system has these abilities: > 1. Property level ACLs. If the user does not have read access for a > property, > then somehow blank it out so that sensitive data is not transmitted on the > wire. If the user does not have write access to a property and the client > attempts to change a value on the property, then throw a security > exception > when they attempt to persist the object. > 2. Instance level ACLs. If the user does not have read access to an > instance, > then filter that instance out: > a. If the instance is the return value of a service method, throw access > denied exception. > b. If the instance appears in a collection, remove it from the > collection. > c. If the instance appears as the value of a property, secure the > property > (via the same process used in #1). > > Apply these symantecs to all returned objects wherever they appear in an > object graph, which, of course, implies recursion. Now consider the > typical > usage pattern for our rich client application: > 1. Rich client makes remote invocation to server side service via service > interface. The interface is a proxy that calls the remote service via > HttpInvoker. > 2. Enter server side: > a. We first encounter the general security proxy that does basic role > based > security checks against the service method itself. > b. Next, we encounter the transaction proxy which establishes a > transaction > context for the remainder of the method invocation. > c. Invoke the actual service method. > d. Service method returns object graph. > e. Leave transaction proxy, meaning the transaction is committed (or > rolled > back in case of error/exception). > f. If there was no error or exception, then we return back to the > security > proxy which now performs ACL security on the returned graph (note that > this > is outside of the transaction). The object graph may be mutated during > this > securing phase. > > As you can imagine, this gets real complicated when using POJOs and > Hibernate > (and your Hibernate model doubles as your DTOs), which is exactly what we > use. If you retrieve an object graph from one service method, make > modifications, and then persist those changes via another service method > invocation you are dealing with two totally separate transactions and > Hibernate Sessions. The ACL mechanism performs actual modifications to > the > POJOs in order to "secure" them, but you do not want these modifications > persisted back to the DB as they were temporary and specific to the > purpose > of securing transmission of data. This is about when you start longing > for > the more dynamic nature of some other languages - it would be so much > easier > if I could set dynamic metadata against a property (a property property), > or > remove a property altogether. Anyway, you somehow have to merge the > allowable mutations made by the client with the original object state > before > persisting to Hibernate. The version of Hibernate we use (< 3.0) does not > make this any easier, though it is possible. There are a lot of various > interactions that can bite you if you aren't very careful with your > implementation. I don't have time now to elaborate on how we solved these > various issues. For now, I'll say that we used a combination of AOP, > Hibernate Interceptor, and special "secured" placeholders for objects. > The > solution is not optimal at the moment. Our version of Hibernate just does > not provide any easy way to optimize things, so we end up reading each and > every object from the DB before updating it. This means at the time of > update we have two copies of each object: the one passed in from the > client > (which is mutilated, so to speak, because of the ACL mods), and one we > just > reloaded from the DB via Hibernate. We end up applying an algorithm to > determine what allowable mutations were made by the client and then making > those same mutations on the "real" object loaded from Hibernate. There > are > other ways to approach the solution, of course (such as proxying every > object > in the graph and recording deltas as the client changes things) - but each > solution has its own set of advantages and disadvantages. The proxy > solution > gets harder to deal with when exposing your service as a web service to > other > types of clients. > > - Andy > > On Wednesday 09 February 2005 02:40 pm, Tim Kettering wrote: > > Hi everyone, > > > > > > > > I've started work on implementing acegi's post-invocation security w/ > ACLs. > > I am also using Spring/Hibernate to handle the data, and tx layer. > > > > > > > > What I am attempting to do is have the post-invocation "scrub" an domain > > object (which will have nested domain objects that need to be checked). > > Making up an example, we have a Store object which can contain a > collection > > of Item objects. So when a service call is made load a store #233, the > > post invocation chain would first check to see if the user has > permission > > to view the Store itself. Once that is allowed, the check goes deeper > into > > the Store itself, and checks each Item in turn to ensure the proper > > permissions. So far it seems to work well. > > > > > > > > But however, since I am using Spring/Hibernate's session/tx management, > I > > found out that when Acegi was scrubbing the Store object, the "changes" > > would be written back to the database by hibernate at the end of the > > session (due to the automatic flush). Which in hindsight, is quite > obvious > > that would happen, and is indeed correct behavior by Hibernate/Spring. > > > > > > > > My next thought was to move the post-invocation stuff outside the > > Hibernate/Spring transaction boundary, but then as a co-worker pointed > out, > > I would lose the benefit of having the proper version of data within the > > transaction when doing the ACL checks against those items. Nested > > transactions is an option, but I thought I'd write a email to the list > and > > inquire if anyone else here has run into this situation and perhaps be > > willing to share a good solution? Or if there is none, we could discuss > > this, and contribute to the knowledge base of good Acegi practices, > since > > this issue is likely to come up again when people start to adopt > > post-invocation more widely. > > > > > > > > Some options that I thought of. > > > > > > > > 1. Nested Transactions. > > 2. Force an hibernate eviction of object at start of post-invocation > > chain (clunky though.. we have some straight jdbc calls too so I hate to > > pollute chain w/ hibernate specific calls). > > > > > > > > Im hoping others might have ideas as well. > > > > > > > > -tim > > > ------------------------------------------------------- > SF email is sponsored by - The IT Product Guide > Read honest & candid reviews on hundreds of IT Products from real users. > Discover which products truly live up to the hype. Start reading now. > http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click > _______________________________________________ > Home: http://acegisecurity.sourceforge.net > Acegisecurity-developer mailing list > Acegisecurity-developer@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/acegisecurity-developer ------------------------------------------------------- SF email is sponsored by - The IT Product Guide Read honest & candid reviews on hundreds of IT Products from real users. Discover which products truly live up to the hype. Start reading now. http://ads.osdn.com/?ad_ide95&alloc_id396&op=click _______________________________________________ Home: http://acegisecurity.sourceforge.net Acegisecurity-developer mailing list Acegisecurity-developer@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/acegisecurity-developer