--- On Sat, 5/2/09, David E Jones <david.jo...@hotwaxmedia.com> wrote:
> My personal opinion on this is that the design has only
> subjective improvements and most of it is a big step
> backwards (easier but less flexible, for the services versus
> direct permission part anyway, and we decided long ago that
> flexibility was better than ease in this case; and yes there
> is a creative way to invoke code attached to permissions,
> but that is a bit inflexible IMO since much permission logic
> involved multiple permissions... it's the artifact we
> want the code attached to not the permission itself)

Take your comment - "it's the artifact we want the code attached to not the 
permission itself" - and combine that with Scott's suggestion to have a 
security-aware delegator, and you have a solution I proposed years ago: a 
domain-driven security system.

In a domain-driven security system, each OFBiz artifact is responsible for 
handling security for itself. There is no explicit permission-checking code. 
Each OFBiz artifact identifies itself in a security domain. When a user tries 
to use that artifact, it checks the user's permissions against its own position 
in the domain.

Using the Example component's EditExample screen as an example, here is what a 
security domain might look like:

framework
  example
    screen
      EditExample (screen)
        EditExample (form)

Permissions are hierarchical - each artifact inherits permissions from the 
artifact above it. This is very similar to what Andrew is trying to achieve, 
but it's different because the artifacts themselves control the security - 
there is no call to a permission service with a permission string.

Here's what it might look like in ExampleScreens.xml:

<screens xmlns:xsi="...">
  <security domain="framework:example:screen"/>

  <screen name="EditExample">
    <security domain="EditExample"/>
    ...
  </screen>

</screens>

Notice there are no explicit permission checks. Instead, each artifact has 
identified itself in the security domain.

When the widget is run, each artifact checks the user's permissions against its 
own security domain. So, the EditExample screen would look for the 
framework:example:screen:EditExample" permissions and handle itself 
accordingly. (Andrew - this is why I suggested having permission checking code 
return all permissions for a context.)

If a user has the access:framework:example:screen:EditExample permission, the 
screen will display.

Let's take a look at what happens in the form widget. Here is what ExampleForms 
would look like:

<form name="EditExample" type="single" target="updateExample" title="" 
default-map-name="example">
  <security domain="EditExample"/>
  ...
</form>

Again, when the widget is run, each artifact checks the user's permissions 
against its own security domain. So, the EditExample form would look for the 
framework:example:screen:EditExample:EditExample" permissions and handle itself 
accordingly.

Let's say the user doesn't have any permissions for that context. Keep in mind 
permissions are hierarchical - so the form widget would work its way up the 
hierarchy to find permissions. If a user has the 
access:framework:example:screen:EditExample permission, the form will display 
plain text with no input fields. If the user has the 
update:framework:example:screen:EditExample permission, the form will provide 
input fields.

Form fields could identify themselves in the security domain as well - so only 
the fields the user is permitted to access will appear.

Service definitions and entities could identify themselves in the security 
domain in a similar way, and have similar permissions checking logic. Some 
examples:

framework
  example
    service
      updateExample

framework
  example
    entity
      Example

The nice thing about this approach is that you could leverage the artifact 
gathering code to display the security domain as a tree - with permission 
checkboxes next to each "leaf." That would enable any administrator to manage 
user security easily.

-Adrian
  


      

Reply via email to