Hi Andreas,
On 06/21/2010 05:00 PM, Andreas Jonsson wrote:
  I will make two proposals for changing the
RightService API:
 The first does not actually change any code, but it is a preparation
 for future changes.  I want to be sure that the methods checkAccess
 and hasAccessLevel aren't used interchangeably; it should be well
 defined when to use one or the other.
 The second proposal is a complete rework of the API, which might be a
 bit further into the future.
 1. Change the semantics of hasAccessLevel slightly.
      Currently the method hasAccessLevel is defined as:
       /**
        * Verifies if the user identified by {@code username} has the
        * access level identified by {@code right} on the document with
        * the name {@code docname}.
      I would like to make a change the describing text into:
       /**
        * Decides whether the access level given by {@code right} should
        * be granted during rendering of the document identified by
        * {@code docname} by request of the user identified by {@code
        * username}.
      In other words, the rights queried for is tied to the thread
      executing a request on behalf of the user.  In contrast, the
      checkAccess method queries for the configured rights of a
      particular user.
      This suggests that the underlying implementation may choose to base
      its decision on more things than the given user and document, and
      thus opens up for more possibilities to change the security policy.
      For instance,
        hasAccessLevel("programming", context.getUser(), docname, context)
      could be made equivalent to
        hasProgrammingRights(context.getWiki().getDocument(docname), context)
      In the current implementation, XWikiRightServiceImpl, the methods
      checkAccess and hasAccessLevel can be used interchangeably once the
      user have been authenticated.  But it seems that the current usage
      pattern more or less matches the above change in semantics already.
 2. Deprecate all methods in the current API and introduce the following
 new ones:
        boolean checkAccess(String action, EntityReference entity);
        boolean userHasRight(DocumentReference userIdentity, Right right,
 EntityReference entity);
        boolean hasAccessLevel(Right right);
        Iterable<Right>  getEnabledRights(EntityType entityType);
      The differences are:
        1. The context parameter is dropped.  The right service can have
           an Execution instance injected instead.
        2. No exceptions are thrown.  Instead, on error, log and deny access.
        3. Identify users by the DocumentReference of their profile page.
 
         4. Introduction of the enum 'Right'.
During the discussion for the new Rights Management UI the idea that the
rights system should be extensible emerged (i.e. components should be
able to define new rights). Using a 'Right' enum doesn't cope well with
that.
Thanks,
Marius
        5. The rights are controlled against entities identified by
           EntityReferences that may be of type WIKI, SPACE or DOCUMENT.
        6. Add a new method, userHasRight, for querying for the specific
           rights of a given user on a given entity, where the entity may
           be wiki, space or document.  This method replaces the method
           hasAdminRights.  I guess this method will be primarily used by
           the user interface.
        7. hasAccessLevel have the same change in semantics as mentioned
           above, and could thus replace the hasProgrammingRights
           methods.  In other words, hasAccessLevel provides the answer
           to the question "should access for an operation that requires
           the specified right be granted given the current context?"
           Within the lifecycle of a request, first a call should be made
           to checkAccess to authenticate the user and to grant access to
           the specific action.  Subsequent security checkpoinst should
           normally use hasAccessLevel.
        8. The listAllLevels-method is moved to the Right enum class.
           The right service could instead provide a method that lists
           what rights are enabled at a particular level in the document
           hierarchy, i.e., the getEnabledRights method, which I guess is
           relevant for the rights manager.
 So, what do you think?
 Best regards,
 Andreas Jonsson
 _______________________________________________
 devs mailing list
 devs(a)xwiki.org
 
http://lists.xwiki.org/mailman/listinfo/devs