need help with Seam Identity
blackmoon Apr 2, 2010 8:26 AMHi, I wrote a new class which subclass from org.jboss.seam.security.Identity in order to cache the permission, here is the code
@Name("identity") @Scope(ScopeType.SESSION) @BypassInterceptors @Startup public class CmsIdentity extends Identity { HashMap<String, Boolean> permissionMap = new HashMap<String, Boolean>(); HashMap<String, Boolean> roleMap = new HashMap<String, Boolean>(); @Override public boolean hasPermission(Object target, String action) { String key = target.toString() + action; if (permissionMap.get(key) == null) { boolean result = super.hasPermission(target, action); permissionMap.put(key, result); return result; } else { return permissionMap.get(key); } } @Override public boolean hasRole(String role) { String key = role; if (roleMap.get(key) == null) { boolean result = super.hasRole(role); roleMap.put(key, result); return result; } else { return roleMap.get(key); } } }
the thing is, when i call an EL like {not identity.loggedIn} it's ok. But when i check restriction using {s:hasRole('admin')} or {s:hasPermission('target','action')}, the NotLoginException is thrown. Here is the strace:
org.jboss.seam.security.NotLoggedInException at org.jboss.seam.security.Identity.checkRestriction(Identity.java:217) at org.jboss.seam.navigation.Page.checkPermission(Page.java:263) at org.jboss.seam.navigation.Page.preRender(Page.java:283) at org.jboss.seam.navigation.Pages.preRender(Pages.java:350) at org.jboss.seam.jsf.SeamPhaseListener.preRenderPage(SeamPhaseListener.java:561) at org.jboss.seam.jsf.SeamPhaseListener.beforeRenderResponse(SeamPhaseListener.java:472) at org.jboss.seam.jsf.SeamPhaseListener.beforeServletPhase(SeamPhaseListener.java:148) at org.jboss.seam.jsf.SeamPhaseListener.beforePhase(SeamPhaseListener.java:118) at com.sun.faces.lifecycle.Phase.handleBeforePhase(Phase.java:214) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:96) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
The org.jboss.seam.security.Identity.checkRestriction() method is not supposed to be called but the subclass with higher precedence instead. Is there any ideas ? Thanks.