Hi all,

I am currently running through Apache OFBiz Development: The Beginner's
Tutorial by Howell and Wong.

I have my dev environment setup in IntelliJ and so far the examples have
all more-or-less worked. I am up to Chapter 11, Permissions and the Service
Engine and have hit some issues.

The example setup in the "learning" component is as follows:

${component:learning}\servicedef\services.xml
---------------------------------------------

<service name="learningCallingServiceOneWithPermission" engine="java"
location="org.ofbiz.learning.learning.LearningServices"
invoke="callingServiceOne">
<description>First Service Called From The Controller</description>
<required-permissions join-type="OR">
<check-permission permission="LEARN_VIEW"/>
</required-permissions>
<implements service="learningInterface"/>
</service>

${webapp:learning}\WEB-INF\controller.xml
-----------------------------------------

<request-map uri="TestPermissions">
<security auth="true" https="true"/>
<response name="success" type="view"
value="TestCallingServicesWithPermission"/>
<response name="error" type="view" value="login"/>
</request-map>
<request-map uri="TestCallingServicesWithPermission">
<security auth="true" https="true"/>
<event type="service" invoke="learningCallingServiceOneWithPermission"/>
<response name="success" type="view"
value="TestCallingServicesWithPermission"/>
<response name="error" type="view"
value="TestCallingServicesWithPermission"/>
</request-map>

and

<view-map name="TestCallingServicesWithPermission" type="screen"
page="component://learning/widget/learning/LearningScreens.xml#TestCallingServicesWithPermission"/>

${component:learning}\widget\learning\LearningScreens.xml
---------------------------------------------------------

<screen name="TestFirstService">
    <section>
        <widgets>
            <section>
                <condition><if-empty field-name="formTarget"/></condition>
                <actions>
                    <set field="formTarget" value="TestFirstService"/>
                    <set field="title" value="Testing Our First Service"/>
                </actions>
                <widgets/>
            </section>
            <decorator-screen name="main-decorator"
location="${parameters.mainDecoratorLocation}">
                <decorator-section name="body">
                    <include-form name="TestingServices"
location="component://learning/widget/learning/LearningForms.xml"/>
                    <label text="Full Name: ${parameters.fullName}"/>
                </decorator-section>
            </decorator-screen>
        </widgets>
    </section>
</screen>
...
<screen name="TestCallingServicesWithPermission">
    <section>
        <actions><set field="formTarget"
value="TestCallingServicesWithPermission"/>
        </actions>
        <widgets>
            <include-screen name="TestFirstService"/>
        </widgets>
    </section>
</screen>

${component:learning}\widget\learning\LearningForms.xml
-------------------------------------------------------

<form name="TestingServices" type="single" target="${formTarget}">
    <field name="firstName"><text/></field>
    <field name="lastName"><text/></field>
    <field name="planetId"><text/></field>
    <field name="submit"><submit/></field>
</form>

With regards to permissions, I have them set up as follows as per Chapter 9:

User            Security Group        SecurityPermission
User/Security Group From Date          User/Security Group Thru Date
-------------------------------------------------------------------------------------------------------------------------------------
allowed         LEARNSCREENS          LEARN_VIEW                 2015-06-15
19:34:15.832                NULL
denied          LEARNSCREENS          LEARN_VIEW                 2015-06-13
18:57:44.724                2015-06-13 18:57:44.724
  "             LEARNSCREENS          LEARN_VIEW                 2015-06-13
18:57:44.000                2015-06-13 19:33:47.000

Under the above configuration, the permissions checks work as advertised,
and "allowed" is able to call the service while "denied" is not.

The next section of the chapter talks about two-part permissions, and makes
the following changes to the configuration. Apparently, OFBiz is supposed
to interpret the underscore in permission attribute as some sort of
tokenising character, where the first token "LEARN" becomes the permission,
and the second part "VIEW" becomes an action. This seems "loose" to me but
nevertheless.

${component:learning}\servicedef\services.xml
---------------------------------------------

<check-permission permission="LEARN_VIEW"/>

becomes

<check-permission permission="LEARN" action="VIEW"/>

According to the text, the authorisation behaviour should remain exactly
the same. In other words, the check-permission elements are equivalent. But
this is not the case. Under the modified configuration, neither "allowed"
nor "denied" are able to call the service. I also don't see a "LEARN" item
in the SecurityPermission entity anywhere, so I don't see how this should
work in the first place.

Is this tokenised approach deprecated? Or is there something else going on?

Reply via email to