[ZODB-Dev] ZEO and access permissions
Nitro
nitro at dr-code.org
Tue May 25 08:33:31 EDT 2010
Am 23.05.2010, 17:53 Uhr, schrieb Jim Fulton <jim at zope.com>:
>> Does it make sense at all or is it still
>> better to restrict access on the application level?
>
> I would do it at the storage level, not in the application nor in ZEO.
>
> It is probably possible with some sort of wrapper storage. There are
> lots of details to be worked out. This is a project I've been looking
> forward to working on for some time, but it is still prettty far down
> on my list.
Thanks for Hanno's and your answer. They are quite different :-) I've
thought a lot more about both approaches. Yet reaching a conclusion is
quite hard. I'll present you some of my reasoning below.
I'll elaborate a bit more on the current design of my application: In the
context of my application "security" does not mean 100% secure against any
kind of attacker, it's more a simple method to prevent some people from
seeing other people's things. And to prevent accidental changes. The
people are all more or less trusted.
My system consists of a server (zodb + twisted) and various desktop
clients. The zodb part of the server is used for storing the data, the
twisted part is used for event sending and various other communications
between clients. All the major work on the data happens on the clients,
the server is pretty dumb.
Until I thought about security I was assuming the desktop clients could
directly access the zodb via ZEO. This would have made many things easy.
Clients could access the database directly, manipulate the data model and
send events accordingly. Other clients receive the events and can update
their views by pulling the changed data from the database.
With security in mind, the design has to change. Let's consider a simple
example of a Folder object with a few sub-folders. The client will send a
request to the server "get all children of folder X". The server will
check if the user has access to folder X and will then return all the
sub-folders to which the client has access to. With the previous model
this would've been as easy as doing "print folder.subfolders", ZEO would
take care of returning subfolders. Of course ZEO will not filter the
subfolders list by security permissions.
Taking this example a step further, if the client wants to add a new
folder, he will have to perform an action "add folder" which takes the oid
of folder X and the name of the new folder (+ other parameters). The
server receives the command, checks if the user may add the new folder and
finally adds it. If the transaction succeeded the server then sends an
event "folder X subfolders changed". The client receives this event and
then issues the "get all children of folder X" event again to update its
view with the new folder.
Another complication: the client side needs a cache. When it receives an
answer to "get all children of folder X" the result should be remembered
until the client receives an event that the children of folder X have
changed. The cache should also be persistent between different runs of the
clients, because building the cache from 0 means the client possibly has
to download gigabytes of data (over a broadband internet connection, not
LAN speed style). It's also a bit unclear to me how to maintain
inter-references between objects if the server never returns objects
directly.
The client's "cache" is more like a local database which should be in sync
with the server's db. There can be differences between server and client
db, because of the differing security permissions.
Synced db between client and server, notifications when objects change,
client side cache. Does all of this sound familiar? ZEO provides all of
this. Except the security part.
To summarize, if I'd go the application level security route (Hanno's way,
implementation as I proposed above):
- Check permissions on the server in all relevant places (e.g. each time a
folder is accessed by someone)
- Client cannot access db directly, has to use indirect commands which the
server executes on the client's behalf
- Layer to serialize and transport objects from server to client and
vice-versa
- Custom client cache implementation
- Unclear how the db as a whole (intra-references) is represented on the
client
Integrating into ZEO:
- Clients could access db directly
- Unclear how this can be implemented. ZEO client sees only proxies of
real server objects? Proxies/views would restrict the access on the client
side (e.g. a folder proxy would provide only a filtered view on all the
subfolders). This is a bit similar to OO RPC calls. E.g.
http://pyro.sourceforge.net/ and twisted's perspective broker provide
something along these lines.
I'd be willing to spend time on implementing something like this if we can
work out a proposal together of how to do things exactly.
-Matthias
More information about the ZODB-Dev
mailing list