You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2014/09/15 22:02:32 UTC

git commit: ISIS-895: check that user has permissions to invoke home page action.

Repository: isis
Updated Branches:
  refs/heads/master eb5b2b07f -> 5cd8afdd4


ISIS-895: check that user has permissions to invoke home page action.

In addition:
- always render menu items, even on Error Page.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/5cd8afdd
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/5cd8afdd
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/5cd8afdd

Branch: refs/heads/master
Commit: 5cd8afdd4a24451c1fecc3f8992bf450931eacf1
Parents: eb5b2b0
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Sep 15 20:39:55 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon Sep 15 20:39:55 2014 +0100

----------------------------------------------------------------------
 .../viewer/wicket/ui/pages/PageAbstract.java    | 26 +++++--------------
 .../viewer/wicket/ui/pages/about/AboutPage.java |  2 +-
 .../ui/pages/actionprompt/ActionPromptPage.java |  4 +--
 .../wicket/ui/pages/entity/EntityPage.java      |  2 +-
 .../viewer/wicket/ui/pages/error/ErrorPage.java |  2 +-
 .../viewer/wicket/ui/pages/home/HomePage.java   | 27 +++++++++++++++++---
 .../StandaloneCollectionPage.java               |  2 +-
 .../viewer/wicket/ui/pages/value/ValuePage.java |  2 +-
 .../ui/pages/voidreturn/VoidReturnPage.java     |  2 +-
 .../interactions/InteractionUtils.java          |  8 ------
 .../specimpl/ObjectMemberAbstract.java          | 17 +-----------
 .../webapp/src/main/resources/webapp/realm1.ini | 19 +++++++++-----
 12 files changed, 52 insertions(+), 61 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/5cd8afdd/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
index c469418..1113641 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
@@ -68,7 +68,6 @@ import org.apache.isis.viewer.wicket.ui.errors.JGrowlUtil;
 import org.apache.isis.viewer.wicket.ui.overlays.Overlays;
 import org.apache.isis.viewer.wicket.ui.pages.about.AboutPage;
 import org.apache.isis.viewer.wicket.ui.panels.PanelUtil;
-import org.apache.isis.viewer.wicket.ui.util.Components;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
 /**
@@ -145,14 +144,8 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
     @Inject
     private PageClassRegistry pageClassRegistry;
 
-    protected enum ApplicationActions {
-        INCLUDE,
-        EXCLUDE
-    }
-    
     public PageAbstract(
             final PageParameters pageParameters,
-            final ApplicationActions applicationActions,
             final String title,
             final ComponentType... childComponentIds) {
         try {
@@ -167,7 +160,7 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
                 themeDiv.add(new CssClassAppender(asCssStyle(applicationName)));
             }
             
-            addApplicationActions(themeDiv, applicationActions);
+            addApplicationActions(themeDiv);
             this.childComponentIds = Collections.unmodifiableList(Arrays.asList(childComponentIds));
             this.pageParameters = pageParameters;
 
@@ -314,7 +307,7 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
     
 
     /**
-     * As provided in the {@link #PageAbstract(org.apache.wicket.request.mapper.parameter.PageParameters, org.apache.isis.viewer.wicket.ui.pages.PageAbstract.ApplicationActions, String, org.apache.isis.viewer.wicket.ui.ComponentType...)} constructor}.
+     * As provided in the {@link #PageAbstract(org.apache.wicket.request.mapper.parameter.PageParameters, String, org.apache.isis.viewer.wicket.ui.ComponentType...)} constructor}.
      * 
      * <p>
      * This superclass doesn't do anything with this property directly, but
@@ -330,16 +323,11 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
         return pageParameters;
     }
 
-    private void addApplicationActions(MarkupContainer container, final ApplicationActions applicationActions) {
-        if(applicationActions == ApplicationActions.INCLUDE) {
-            addActionPromptModalWindow();
-            final ApplicationActionsModel model = new ApplicationActionsModel();
-            model.setActionPromptProvider(this);
-            addComponent(container, ComponentType.APPLICATION_ACTIONS, model);
-        } else {
-            Components.permanentlyHide(container, ComponentType.APPLICATION_ACTIONS);
-            Components.permanentlyHide(container, ID_ACTION_PROMPT_MODAL_WINDOW);
-        }
+    private void addApplicationActions(MarkupContainer container) {
+        addActionPromptModalWindow();
+        final ApplicationActionsModel model = new ApplicationActionsModel();
+        model.setActionPromptProvider(this);
+        addComponent(container, ComponentType.APPLICATION_ACTIONS, model);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/5cd8afdd/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/about/AboutPage.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/about/AboutPage.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/about/AboutPage.java
index a0e89f5..e6c3296 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/about/AboutPage.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/about/AboutPage.java
@@ -32,7 +32,7 @@ public class AboutPage extends PageAbstract {
     private static final long serialVersionUID = 1L;
 
     public AboutPage() {
-        super(new PageParameters(), ApplicationActions.INCLUDE, null, ComponentType.ABOUT);
+        super(new PageParameters(), null, ComponentType.ABOUT);
         addBookmarkedPages();
         addChildComponents(themeDiv, null);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5cd8afdd/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java
index 1e03f1a..a36becb 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java
@@ -39,7 +39,7 @@ public class ActionPromptPage extends PageAbstract {
      * For use with {@link Component#setResponsePage(org.apache.wicket.Page)}
      */
     public ActionPromptPage(final ActionModel model) {
-        super(new PageParameters(), ApplicationActions.INCLUDE, model.getActionMemento().getAction().getName(), ComponentType.ACTION_PROMPT);
+        super(new PageParameters(), model.getActionMemento().getAction().getName(), ComponentType.ACTION_PROMPT);
         addChildComponents(themeDiv, model);
 
         if(model.isBookmarkable()) {
@@ -53,7 +53,7 @@ public class ActionPromptPage extends PageAbstract {
     }
     
     public ActionPromptPage(final PageParameters pageParameters, final ActionModel model) {
-        super(pageParameters, ApplicationActions.INCLUDE, model.getActionMemento().getAction().getName(), ComponentType.ACTION_PROMPT);
+        super(pageParameters, model.getActionMemento().getAction().getName(), ComponentType.ACTION_PROMPT);
         addChildComponents(themeDiv, model);
         
         // no need to bookmark because the ActionPanel will have done so for us

http://git-wip-us.apache.org/repos/asf/isis/blob/5cd8afdd/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
index e7ca28c..b3c5d9a 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
@@ -88,7 +88,7 @@ public class EntityPage extends PageAbstract {
             final PageParameters pageParameters,
             final EntityModel entityModel,
             final String titleString) {
-        super(pageParameters, ApplicationActions.INCLUDE, titleString, ComponentType.ENTITY);
+        super(pageParameters, titleString, ComponentType.ENTITY);
 
         this.model = entityModel;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/5cd8afdd/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/error/ErrorPage.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/error/ErrorPage.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/error/ErrorPage.java
index 6d61334..024f0ca 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/error/ErrorPage.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/error/ErrorPage.java
@@ -37,7 +37,7 @@ public class ErrorPage extends PageAbstract {
 
 
     public ErrorPage(ExceptionModel exceptionModel) {
-        super(new PageParameters(), ApplicationActions.EXCLUDE, null);
+        super(new PageParameters(), null);
 
         addBookmarkedPages();
 

http://git-wip-us.apache.org/repos/asf/isis/blob/5cd8afdd/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/home/HomePage.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/home/HomePage.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/home/HomePage.java
index ae3e974..d45b8a9 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/home/HomePage.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/home/HomePage.java
@@ -23,7 +23,9 @@ import java.util.List;
 import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.facets.actions.homepage.HomePageFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
@@ -42,7 +44,7 @@ public class HomePage extends PageAbstract {
     private static final long serialVersionUID = 1L;
 
     public HomePage() {
-        super(new PageParameters(), ApplicationActions.INCLUDE, null);
+        super(new PageParameters(), null);
         
         addChildComponents(themeDiv, null);
         buildGui();
@@ -77,12 +79,31 @@ public class HomePage extends PageAbstract {
             final ObjectSpecification serviceSpec = serviceAdapter.getSpecification();
             final List<ObjectAction> objectActions = serviceSpec.getObjectActions(Contributed.EXCLUDED);
             for (final ObjectAction objectAction : objectActions) {
-                if(objectAction.containsFacet(HomePageFacet.class)) {
-                    return new ObjectAndAction(serviceAdapter, objectAction);
+                final ObjectAndAction oaa = objectAndActionIfHomePageAndUsable(serviceAdapter, objectAction);
+                if(oaa != null) {
+                    return oaa;
                 }
             }
         }
         return null;
     }
 
+    private ObjectAndAction objectAndActionIfHomePageAndUsable(ObjectAdapter serviceAdapter, ObjectAction objectAction) {
+        if (!objectAction.containsDoOpFacet(HomePageFacet.class)) {
+            return null;
+        }
+
+        final Consent visibility = objectAction.isVisible(getAuthenticationSession(), serviceAdapter, Where.ANYWHERE);
+        if (visibility.isVetoed()) {
+            return null;
+        }
+
+        final Consent usability = objectAction.isUsable(getAuthenticationSession(), serviceAdapter, Where.ANYWHERE);
+        if (usability.isVetoed()) {
+            return  null;
+        }
+
+        return new ObjectAndAction(serviceAdapter, objectAction);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/5cd8afdd/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/standalonecollection/StandaloneCollectionPage.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/standalonecollection/StandaloneCollectionPage.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/standalonecollection/StandaloneCollectionPage.java
index 685fc09..b4c1a3a 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/standalonecollection/StandaloneCollectionPage.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/standalonecollection/StandaloneCollectionPage.java
@@ -40,7 +40,7 @@ public class StandaloneCollectionPage extends PageAbstract {
      * For use with {@link Component#setResponsePage(org.apache.wicket.Page)}
      */
     public StandaloneCollectionPage(final EntityCollectionModel model) {
-        super(new PageParameters(), ApplicationActions.INCLUDE, actionNameFrom(model), ComponentType.STANDALONE_COLLECTION);
+        super(new PageParameters(), actionNameFrom(model), ComponentType.STANDALONE_COLLECTION);
         addChildComponents(themeDiv, model);
 
         addBookmarkedPages();

http://git-wip-us.apache.org/repos/asf/isis/blob/5cd8afdd/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/value/ValuePage.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/value/ValuePage.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/value/ValuePage.java
index f42fa89..62eaabd 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/value/ValuePage.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/value/ValuePage.java
@@ -49,7 +49,7 @@ public class ValuePage extends PageAbstract {
 
     
     private ValuePage(ValueModel valueModel, String actionName) {
-        super(new PageParameters(), ApplicationActions.INCLUDE, actionName, ComponentType.VALUE);
+        super(new PageParameters(), actionName, ComponentType.VALUE);
         
         themeDiv.addOrReplace(new Label(ID_ACTION_NAME, actionName));
 

http://git-wip-us.apache.org/repos/asf/isis/blob/5cd8afdd/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/voidreturn/VoidReturnPage.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/voidreturn/VoidReturnPage.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/voidreturn/VoidReturnPage.java
index 91a7451..50b1ce3 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/voidreturn/VoidReturnPage.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/voidreturn/VoidReturnPage.java
@@ -47,7 +47,7 @@ public class VoidReturnPage extends PageAbstract {
     }
 
     private VoidReturnPage(final VoidModel model, final String actionName) {
-        super(new PageParameters(), ApplicationActions.INCLUDE, actionName, ComponentType.VOID_RETURN);
+        super(new PageParameters(), actionName, ComponentType.VOID_RETURN);
 
         themeDiv.addOrReplace(new Label(ID_ACTION_NAME, actionName));
         

http://git-wip-us.apache.org/repos/asf/isis/blob/5cd8afdd/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionUtils.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionUtils.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionUtils.java
index 7f2dc48..0af9114 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionUtils.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionUtils.java
@@ -42,10 +42,6 @@ public final class InteractionUtils {
         return result;
     }
 
-    public static InteractionResultSet isVisibleResultSet(final FacetHolder facetHolder, final VisibilityContext<?> context, final InteractionResultSet resultSet) {
-        return resultSet.add(isVisibleResult(facetHolder, context));
-    }
-
     public static InteractionResult isUsableResult(final FacetHolder facetHolder, final UsabilityContext<?> context) {
         final InteractionResult result = new InteractionResult(context.createInteractionEvent());
         final List<Facet> facets = facetHolder.getFacets(FacetFilters.isA(DisablingInteractionAdvisor.class));
@@ -57,10 +53,6 @@ public final class InteractionUtils {
         return result;
     }
 
-    public static InteractionResultSet isUsableResultSet(final FacetHolder facetHolder, final UsabilityContext<?> context, final InteractionResultSet resultSet) {
-        return resultSet.add(isUsableResult(facetHolder, context));
-    }
-
     public static InteractionResult isValidResult(final FacetHolder facetHolder, final ValidityContext<?> context) {
         final InteractionResult result = new InteractionResult(context.createInteractionEvent());
         final List<Facet> facets = facetHolder.getFacets(FacetFilters.isA(ValidatingInteractionAdvisor.class));

http://git-wip-us.apache.org/repos/asf/isis/blob/5cd8afdd/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
index a232cf4..6b4f183 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
@@ -20,7 +20,6 @@
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import java.util.List;
-
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.When;
 import org.apache.isis.applib.annotation.Where;
@@ -32,7 +31,6 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.QuerySubmitter;
 import org.apache.isis.core.metamodel.adapter.ServicesProvider;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.consent.Allow;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
 import org.apache.isis.core.metamodel.consent.InteractionResult;
@@ -41,16 +39,11 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
-import org.apache.isis.core.metamodel.facets.actions.homepage.HomePageFacet;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.all.help.HelpFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.interactions.DisablingInteractionAdvisor;
-import org.apache.isis.core.metamodel.interactions.HidingInteractionAdvisor;
-import org.apache.isis.core.metamodel.interactions.InteractionUtils;
-import org.apache.isis.core.metamodel.interactions.UsabilityContext;
-import org.apache.isis.core.metamodel.interactions.VisibilityContext;
+import org.apache.isis.core.metamodel.interactions.*;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
@@ -231,10 +224,6 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
      */
     @Override
     public Consent isVisible(final AuthenticationSession session, final ObjectAdapter target, Where where) {
-        final boolean isHomePage = containsDoOpFacet(HomePageFacet.class);
-        if(isHomePage) {
-            return Allow.DEFAULT;
-        }
         return isVisibleResult(session, target, where).createConsent();
     }
 
@@ -257,10 +246,6 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
      */
     @Override
     public Consent isUsable(final AuthenticationSession session, final ObjectAdapter target, Where where) {
-        final boolean isHomePage = containsDoOpFacet(HomePageFacet.class);
-        if(isHomePage) {
-            return Allow.DEFAULT;
-        }
         return isUsableResult(session, target, where).createConsent();
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/5cd8afdd/example/application/todoapp/webapp/src/main/resources/webapp/realm1.ini
----------------------------------------------------------------------
diff --git a/example/application/todoapp/webapp/src/main/resources/webapp/realm1.ini b/example/application/todoapp/webapp/src/main/resources/webapp/realm1.ini
index 6483045..57036eb 100644
--- a/example/application/todoapp/webapp/src/main/resources/webapp/realm1.ini
+++ b/example/application/todoapp/webapp/src/main/resources/webapp/realm1.ini
@@ -33,9 +33,9 @@
 #
 
 sven = pass, admin_role
-dick = pass, user_role, analysis_role, self-install_role
-bob  = pass, user_role, self-install_role
-joe  = pass, user_role, self-install_role
+dick = pass, readwrite_role, dashboard_role, analysis_role, self-install_role
+bob  = pass, readwrite_role, dashboard_role, self-install_role
+joe  = pass, readwrite_role, self-install_role
 guest = guest, readonly_role
 
 
@@ -70,19 +70,24 @@ guest = guest, readonly_role
 
 
 # configuring iniRealm to use Shiro's built-in WildcardPermissions
+
+readwrite_role = *:ToDoItems:*:*,\
+                 *:ToDoItem:*:*
+
 readonly_role = *:ToDoItems:notYetComplete:*,\
                 *:ToDoItems:complete:*,\
                 *:ToDoItems:allToDos:*,\
-                *:ToDoAppDashboard:*:*,\
                 *:ToDoItem:*:r
 
-user_role = *:ToDoItems:*:*,\
-            *:ToDoItem:*:*,\
-            *:ToDoAppDashboard:*:*
+dashboard_role = *:ToDoAppDashboardService:*:*,\
+                 *:ToDoAppDashboard:*:*
+
 analysis_role = *:ToDoItemAnalysis:*:*,\
             *:ToDoItemsByCategoryViewModel:*:*,\
             *:ToDoItemsByDateRangeViewModel:*:*
+
 self-install_role = *:ToDoItemsFixturesService:installFixtures:*
+
 admin_role = *