[Grok-dev] Re: grok and complicated permissions
Wichert Akkerman
wichert at wiggy.net
Wed Sep 26 17:00:50 EDT 2007
Previously Martijn Faassen wrote:
> Brandon Craig Rhodes wrote:
> >I have read PvW's book and also example Grok code, and am not finding
> >a complicated enough security scheme for my needs. It looks like the
> >default scheme (which is similar to the one used in Plone 2) involves
> >giving actors permissions expressed as strings ('Create mammoth') and
> >then saying that certain grok.Views (or, in pure Zope 3, that certain
> >object attribute accesses) require that permission.
> >
> > 1) I need more interesting rules. For example, if "Change password"
> > is a permission required to use my "ChangePasswordView", then in
> > my case it will depend on the combination of who is attempting the
> > change and whose account they are acting on. The rule will be
> > something like: "If you are a campus-wide admin, you can change
> > the password of any account; but if you are department-hired
> > admin, then you can only change the passwords of users who work
> > for your department."
> [snip]
>
> You could solve this by using local roles given suitably organized
> object hierarchies. You allow anyone with the 'Change password'
> permission to access the ChangePasswordView. You store these objects per
> department and then give someone a local role (or permission) on the
> department they're allowed to edit.
>
> Alternatively you can go for an entirely new zope security policy.
> Zope's security policy is replacable. zope.app.securitypolicy implements
> the default one, but it is replacable. A bigger task, of course.
>
> > 2) Part of what attracted me to Zope 3, as I read PvW's book, was
> > that objects can be protected rather than views. I like the idea
> > of saying what can and can't be done to objects themselves.
> >
> > If I have to protect an account from having its password changed,
> > for example, I can restrict access to its "change_pw()" method and
> > know that no present or future View will accidentally get coded in
> > such a way as to let an agent run the method.
>
> This sounds nice in theory. In practice while developing with Zope 3, it
> tended to slow me down enormously, as Zope 3's security policy was to
> make everything private by default. Of course the first five tries while
> developing you'd forget to open exactly those permissions with exactly
> the required permissions. Early on during development you just want to
> see stuff on your screen and not actually worry about permissions yet.
> This is why we deliberately pulled all of this out of Grok. If a
> security system is secure by default but actually frustratingly hard to
> reason about, it won't be secure in the end.
>
> That said, I know there is an interest in seeing this work with Grok
> though. Grok should definitely not be standing in the way of making this
> work (currently its own publication rips off security proxies, and this
> behavior should become optional). Perhaps a security system where
> methods are public by default, and a @grok.require decorator system to
> annotate such methods with permissions, is actually workable.
> Experimentation awaits us.
>
> > Do we have a story yet for how Grok security, which from what I
> > can tell is built around Views, can be pushed back down on to
> > objects and their attributes?
>
> If you modify Grok's publication and stop it from removing the security
> proxies automatically, you're quite far along already. You'd also need
> to write grokkers that then act on whatever information @grok.require
> leaves behind in the class or module and registers it with Zope 3.
>
> Note that Zope 3's security system is limited; no security checks are
> made for objects returned by a catalog query for instance, or objects
> that you retrieve by getUtility. At the same time it's also pervasive:
> get a security proxy into the wrong parts of your codebase and it will
> tend to gum up the works in frustrating ways.
>
> > One of the things that I have,
> > actually, enjoyed about Plone is that if you protect a piece of
> > content, then it magically disappears from both its own views and
> > all views of its container (of which there are sometimes two or
> > three that might list or let you rename the object!) for not
> > authorized users, but everything else on each page continues to be
> > displayed for them. It's neat to be able to create complex views
> > that show a dozen things, and know that one of the dozen will be
> > missing but leave the page functioning if a security setting turns
> > off access to it.
>
> Actually this is something that a security system by itself does not do.
> Plone (or CMF) must somewhere be inspecting the objects permissions and
> not returning these as results. Someone more knowledgeable about Plone
> will be able to tell you where it does this.
It's a special catalog index that indexes which roles, users and groups
have view permission on the object.
Wichert.
--
Wichert Akkerman <wichert at wiggy.net> It is simple to make things.
http://www.wiggy.net/ It is hard to make things simple.
More information about the Grok-dev
mailing list