Stefano Mazzocchi wrote:
> Brian Topping wrote:
<snip/>
> > What I am wondering is whether such a CMS has any business being that
> > tight with Cocoon.  If not, a set of interfaces ought to be developed
> > for them to couple through, but either way is this an attractive vision?
>
> I have the perception that Cocoon might provide components for access
> control, but should not have this semantics built right into its main
> concepts (see sitemap, flowmap).
>
> Or maybe not: access control is a first-class citizen of the realm of
> publishing (both on the front and on the back).... but I have the fear
> that tighting this too much might blow Cocoon into a full CMS and I want
> to keep this decoupled: Cocoon is already big enough.
>
> I mean: we have actions, right? access control is an action, no? Cool,
> we have the ability to add access control in Cocoon.
<snip/>

So, how can access control (AC) be integrated in Cocoon? And how much
would integration of AC need to affect the current architecture?

I think there are three main points for AC in Cocoon:

1. Protection of pipelines.
2. Protection of request URI:s.
3. Protection of resources (content and components) that are used to
   fulfill a request.

Protection of Pipelines
----------------------
In Cocoon today there are some support for action based AC:

  <map:match pattern="**.html">
    <map:act type="db-authenticator">
     <!-- parameters -->
     <map:generate src="docs/{1}.xml"/>
     <map:transform src="stylesheets/page/simple-page2html.xsl"/>
     <map:serialize type="html"/>
    </map:act>
    <map:redirect-to uri="login"/>
  </map:match>

The idea here is that one protect a pipeline, or a set of
pipelines. IMHO this leads to mixing of concerns: in the example above
we might want different AC for different documents in the docs
directory. How we construct a pipeline is do not have to be related to
who is allowed to access it. If we have N protection classes for
documents and M ways to present the documents we will need N*M
different pipelines in the sitemap. Furthermore if we change the
protection classes we will have to change the sitemap.

Pipeline based AC is useful (and maybe the only realistic alternative)
for operations like updates in DB, but does not seem to scale well.

Protection of Request URI:s
---------------------------
One way to decouple pipeline construction from AC is to describe what
URI:s a certain user (principal) is allowed to access (and possibly in
what way), in a separate document. For this scenario the access right
are checked before the rest of the sitemap is allowed to be
accessed. This could be done like this, e.g.:

  <map:pipeline>
    <map:act type="deny-access" src="AC.xml">
      <map:redirect-to uri="login"/>
    </map:act>

    <!-- Rules for actually doing something -->

  </map:pipeline>

There should also be utility functions in e.g. XSP for asking about if
an URI is accessible for the current user. This could be used to
choose the rendering scheme for links dependent on if they are
accessible or not.

We need a format for describing the access rights. Here I belive that
it is a god idea to use the concepts from AC in webdav (see
www.webdav.org/acl):

* It is designed for AC for web resources.
* It is standardized.
* There are (hopefully reusable) implementations (e.g. Slide).
* There are standardized http methods for asking a server about AC.

Here is an example of AC configuration in Slide (I removed some parts
and attributes that are of more technical nature or not relevant for
our discussion).

  <objectnode uri="/">
    <permission action="/actions" subject="/users/root"/>
    <permission action="/actions/read" subject="/users"
inheritable="false"/>

    <objectnode uri="/users">
      <permission action="/actions" subject="/users/guest"
                  inheritable="true" negative="true"/>
      <permission action="/actions/read" subject="/users"
inheritable="false"/>

    <objectnode uri="/files">
      <permission action="/actions/manage" subject="/users/john"/>
      <permission action="/actions/write" subject="+/users/groupA"/>
      <permission action="/actions/read" subject="nobody"/>
    </objectnode>
  </objectnode>

In webDAV ACL the principals, actions and resources form hierarchies
that are denoted by URI:s. For Cocoon use objectnode/@uri could
correspond to request URI:s. The first permission rule e.g., says that
principals who's id starts with /users/root are allowed to perform all
actions (starting with /action) on all resources (starting with
/). See the Slide documentation for more details.

In WebDAV action classes corresponds to HTTP methods, like GET, PUT,
DELETE, etc. What they correspond to in Cocoon is not obvious, for
ordinary webapps only GET and POST are used and Cocoon does not care
much about what HTTP method that is used. The only concept that
corresponds to WebDAV actions is the cocoon-action request parameter
for action sets.

Access control for request URI:s could be implemented (by using an
external AC system like e.g. Slide) without affecting the current
contracts in Cocoon. IMO, AC based on request URI:s offers a much
better SoC than AC based on protection of pipelines, but it still has
the drawback that it doesn't protect resources.

Protection of resources
-----------------------
So what would it mean to protect the resources that are used to
fulfill a request to Cocoon? Consider the following pipeline:

  <map:match pattern="foo.html">
    <map:generate src="foo.xml"/>
    <map:transform type="sql">
      <map:parameter name="use-connection" value="bar"/>
    </map:transform>
    <map:transform src="table2html.xsl"/>
    <map:serialize/>
  </map:match>

If we had a resource based AC system, then to be allowed to access
foo.html, the user would be required to have read access to foo.xml,
and execute access to table2html.xsl, what access rigths that are
needed for the access of the DB bar is harder to know, as it would
require an analysis of the query. Anyhow, the mechanism is that the
user is allowed to perform an operation on a resource if the user has
the required access rights for all resources that are needed to
compose the pipeline. All components with access restriction must thus
be able to tell what is allowed, they must implement a AC interface,
e.g.:

  interface Accessible {
    boolean hasPermission(Resource object, Principal subject, Action
action);
  }

And composed component must know what kind of actions that are needed
for its parts. This gives a hint about the distribution of
responsibility for AC: non-composed component should ask an underlying
CMS about AC, and composed component must be able to combine access
rights.

To conclude: I belive that a request URI based AC system have clear
advantages compared to pipeline based AC, and that it could be added
to Cocoon without effecting the contracts at all. I also think that
the "correct" way of handling security is a resource based system, and
that a such would need to affect the inner workings of Cocoon.

Comment, ideas?

/Daniel Fagerstrom


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]

Reply via email to