[
https://issues.apache.org/jira/browse/SLING-9871?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17304635#comment-17304635
]
Ashish Chopra commented on SLING-9871:
--------------------------------------
hi [~enorman],
bq. Do your requirements need more complexity, where a principal may have more
than one ACE with (for example) different restrictions or something that need
to be in some specific order?
The cases I was dealing with had exactly this issue. For a given principal
there were two ACEs with different "types" (one was deny, other was allow) _as_
well are different restrictions. Since the last ACE wins, I had to ensure that
the the "allow with restrictions" id added _after_ the (wider) "deny".
The "allow with restrictions" ACE was added by a repoinit directive in a
feature-model file that was being processed _before_ the one containing the
"deny" ACE, messing up the order.
The only way I could address that was by:
* "guessing" that the feature-model file processing order is alphabetical, and
that's what repoinit {{set ACL}} implicitly uses to decide in which order to
add ACEs
* creating a _third_ feature-model file which contained the "deny" ACE
attempted to reorder.
Not only is it hard to figure out for the uninitiated, it results in
proliferation of feature-models at best and loss of ownership of the
development teams for their ACEs for shared principals at worst.
bq. I'm not sure how we would be able to uniquely identify which ACE is which
in that scenario for the purpose of ordering them. For that use case it seems
to me that there would need to be some way to store an "id" with each ACE that
you could reference?
I'm not aware if Oak has such a (hidden or otherwise) {{id}} or such for a
rep:policy node - however I think the identifier can purely exist at
repo-initializer level.
{{allow}}/{{deny}} directives in a {{set ACL}} block already support a {{with
restrictions(...)}}. If it can be further enhanced to add an optional {{with
id(<any_string>)}} or such, it should be possible to write targetted ordering
instructions.
e.g. in {{feature-model-1}}
{noformat}
set ACL for bob
allow jcr:read on /conf with restrictions(*/settings/*/assets) and
id(bob_reads_assets_settings)
end
{noformat}
in {{feature-model-2}}
{noformat}
set ACL for alice
allow jcr:read on /conf with restrictions(*/settings/*/sites) and
id(alice_reads_sites_settings)
end
{noformat}
and, in {{feature-model-3}}
{noformat}
set ACL on /conf
deny jcr:read for everyone with id(no_one_reads_conf_root)
end
{noformat}
In the example above, bob and alice are members of the group "everyone", and we
want bob's and alice's read ACEs to be added after everyone's deny for them to
be able to read respective settings that they have access to.
Given the order in which the feature-files are aggregated and processed today,
this isn't possible.
However, if {{feature-model-1}} can add something like:
{noformat}
order ACL
bob_reads_assets_settings after no_one_reads_conf_root
end
{noformat}
and {{feature-model-2}} has
{noformat}
order ACL
alice_reads_sites_settings after no_one_reads_conf_root
end
{noformat}
or alternatively,
{{feature-model-3}} has
{noformat}
order ACL
first no_one_reads_conf_root
end
{noformat}
the final ordering would be as desired, all the while leaving the onwership of
the ACEs in the respective feature-models.
To account for any ACEs that the current feature aggregate doesn't define, the
(re-)ordering can be done after all the ACEs have been added. The impl can
'match' existing ACEs with the ids specified in the directives before
attempting to reorder them. Since ids are optional, the (re-)ordering must be
limited to only those ACEs that define one.
At the moment, the only way to achieve the desired order is to move all three
setups to a common feature-model and order them as desired, but suffers from
the concerns noted above (thus negating the benefits of fully contained
feature-model definitions).
My proposal above:
* doesn't address the scenarios where {{set ACL}} targets multiple
principals/resources
** I think the ability to target multiple entities is a matter of convenience,
and it should be OK to ask the developer to give this convenience up if
ordering is desired.
* assumes that {{id}} can't collide
** repoinit parser can be enhanced to throw invalid-syntax errors if ids
specified under {{set ACL}} directives collide.
> Specifying order of ACEs through repoinit directives
> ----------------------------------------------------
>
> Key: SLING-9871
> URL: https://issues.apache.org/jira/browse/SLING-9871
> Project: Sling
> Issue Type: Improvement
> Components: Repoinit
> Reporter: Ashish Chopra
> Priority: Major
>
> As of writing this, repoinit processor (among other things not relevant to
> this JIRA) collects {{create path}} statements and {{set ACL}} statements
> declared in all the feature-models applicable to feature-aggregate under
> consideration.
> Upon repository initialization, it applies all the {{create path}}
> statements, followed by all the {{set ACL}} statements. However, the order in
> which {{set ACL}} statements declared across feature models are applied isn't
> defined (currently, it seems to be based on feature-model-name,
> alphabetically ascending).
> This causes issues at times because we want the order of the ACEs to be
> maintained (e.g., "deny"s for everyone at a given path must be the first ACE,
> followed by "allow"s for specific, non-system-user principals)
> Repoinit should be able to support this requirement.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)