On Aug 17, 2011, at 10:35 AM, Jason Smith wrote: > On Wed, Aug 17, 2011 at 9:18 PM, Adam Kocoloski <kocol...@apache.org> wrote: >> I believe the _security object should be versioned in order to ease >> synchronization of the object between databases. This proposal is motivated >> (unsurprisingly) by BigCouch, which typically stores multiple copies of each >> database in a multi-master configuration. When the _security object is >> written in BigCouch the update is issued to all available shards. We run >> into problems if an update is issued while some shards are unavailable, >> because we don't know how to synchronize the divergent copies once all the >> shards are back online. >> >> In my head I see us representing the _security object using a >> #full_doc_info, just as we would a document. Unlike documents the _security >> object (or a pointer to it) would still be written in the header of the >> database for fast access during request processing. >> >> I haven't quite decided what I think the API should look like, e.g. whether >> the full document API (including attachments?) should be supported. Regards, > > In the spirit of re-using existing working components: > > How do you feel about migrating to a blessed _local/security document? > Maybe its latest version could be cached in the header for speed? > > Pros: > > * Couch gets (conceptually) simpler rather than more complex > * It's versioned, you get full doc semantics > * It doesn't replicate, but 3rd-party tools can pseudo-replicate it as needed > * Design documents can enforce policies: if(doc._id == _local/security > && doc.members.length == 0) throw {forbidden:"This database may never > be public"} > > Eagerly awaiting a list of cons :)
The only trouble I have with _local/security is that _local documents are represented using #doc records instead of #full_doc_info records. As such, they have no support for MVCC. If we managed to get into a situation where the copies of the _local/security document had really diverged (instead of one copy simply missing some updates), we'd have a difficult time merging those conflicting versions. On the other hand, the challenges I'm having with _security happen with any _local document, too. Perhaps the right approach is to upgrade the storage format for the local tree to use #full_doc_info and store the _security object as a _local document like you suggest (cached on opening the database, of course). > Since the _security object is conveniently glued to databases but not > replicated, I have been tempted to overload it to store per-database > security settings. There is the CORS discussion, but even simple > stuff: > > { "admins": {"names":[...], "roles":[...]} > , "members": {"names":[...], "roles":[...]} > , "read_only": true > , "create_only": true > , "delete_only": true > , "changes_only_allowed_on":"thursday" > } > > // validate_doc_update > function(newDoc, oldDoc, userCtx, secObj) { > // read_only, create_only, delete_only obviously aren't true at the > // same time, just making a concise example. > > // Read-only example > if(secObj.read_only) > throw {forbidden: "This database is read-only"}; > > // Create-only example > if(oldDoc && secObj.create_only) > throw {forbidden: "This database is create-only"}; > > // Delete-only example > if(!newDoc._deleted && secObj.delete_only) > throw {forbidden: "This database is delete-only"}; > > // Changes only allowed on Thursday left as an exercise. > } > > However I have not done that because I'm not sure if it is "with the > grain" in CouchDB. Maybe these are best swallowed up into the ddoc > itself. (But then when I replicate, now I have to quickly update that > ddoc for that database's security environment.) I have no qualms about adding that sort of information to _security. Regards, Adam