The problem we are discussing (I think) is that if the ACL filtering is
done within the transaction, the session will try to persist it.  Not
sure if this can be done but what I'm suggesting is that the aspect be
applied on the load() method or some joinpoint where the object has yet
to be made part of a transaction; therefore the session should not try
and persist the changes.  

This solution would depend on how hibernate determines what properties
to persist.  If the client only modified fields A and B, and the filter
nulled out C (before the transaction began), I wonder when the session
is flushed if Hibernate will correctly identify the columns to update.

This is really beginning to sound like a hibernate thread.

> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] On Behalf
Of
> Andy Depue
> Sent: Wednesday, February 09, 2005 3:55 PM
> To: acegisecurity-developer@lists.sourceforge.net
> Subject: Re: [Acegisecurity-developer] PostInvocation and Hibernate
> Sessions
> 
> How would that solve this flow:
> 1. Get object from service call (the object has been modified by ACL
> security).
> 2. Change object.  Something like obj.setProperty(newValue) or
> obj.addSomething(something) or obj.getSomeSet().add(something)
> 3. Pass changed object to service method for processing (persisting).
> 
> At step #3 you want to persist the changes that were made by the
client
> but
> not the changes made by ACL filtering.
> 
>   - Andy
> 
> On Wednesday 09 February 2005 03:39 pm, March, Andres wrote:
> > 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
> 
> 
> -------------------------------------------------------
> 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

Reply via email to