Hallo Java-Community,
einiger Stunden langer versuche zu trotz habe ich mein Problem nicht in den Griff bekommen:
Ich habe eine Webapplikation mit einer ManagedBean (Session). Daneben ein EJB3-Projekt auf dass ich von der Bean zugreife:
Im Webprojekt möchte ich bestimmte Bereiche nur bestimmten Rollen zugänlgich machen. Das funktioniert auch ganz gut. So kann ich dort ermitteln ob der aktuelle Nutzer in einer Rolle steckt:
Jetzt möchte ich in der EJB den Zugriff zusätzlich absichern:
Erstmal funktioniert zwar der Zugriff auf die EJB, aber nicht die Rollenüberprüfung.
Vieleicht noch einige Worte zur Umgebung: ich verwende JBoss 4.2.3 und habe dort auch schon die login-config.xml bearbeited und dort eine <application-police> eingefügt. Im Webprojekt funktioniert die auch 1a.
jboss.xml im EJB-Projekt
[XML]
<jboss>
<security-domain>java:/jaas/myLogin</security-domain>
</jboss>
[/XML]
jboss-web.xml im Webprojekt
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss-web PUBLIC
"-//JBoss//DTD Web Application 2.3//EN"
"http://www.jboss.org/j2ee/dtd/jboss-web_3_0.dtd">
<jboss-web>
<security-domain>java:/jaas/myLogin</security-domain>
</jboss-web>
[/XML]
Mit der jboss.xml im EJB-Projekt fliegen jetzt Exceptions:
Also, wie funktioniert die Weitergabe der principals?
Palador
einiger Stunden langer versuche zu trotz habe ich mein Problem nicht in den Griff bekommen:
Ich habe eine Webapplikation mit einer ManagedBean (Session). Daneben ein EJB3-Projekt auf dass ich von der Bean zugreife:
Java:
InitialContext ctx = new InitialContext(env);
TestBeanLocal testBean = (TestBeanLocal) ctx.lookup("TestBean/local");
Im Webprojekt möchte ich bestimmte Bereiche nur bestimmten Rollen zugänlgich machen. Das funktioniert auch ganz gut. So kann ich dort ermitteln ob der aktuelle Nutzer in einer Rolle steckt:
Java:
FacesContext.getCurrentInstance().getExternalContext().isUserInRole("editor");
Jetzt möchte ich in der EJB den Zugriff zusätzlich absichern:
Java:
@Stateless
public class TestBean implements TestBeanLocal {
@RolesAllowed("editor")
public int doSomeEditorStuff() {
return 123;
}
@RolesAllowed("reader")
public int doSomeReaderStuff() {
return 345;
}
}
Erstmal funktioniert zwar der Zugriff auf die EJB, aber nicht die Rollenüberprüfung.
Vieleicht noch einige Worte zur Umgebung: ich verwende JBoss 4.2.3 und habe dort auch schon die login-config.xml bearbeited und dort eine <application-police> eingefügt. Im Webprojekt funktioniert die auch 1a.
jboss.xml im EJB-Projekt
[XML]
<jboss>
<security-domain>java:/jaas/myLogin</security-domain>
</jboss>
[/XML]
jboss-web.xml im Webprojekt
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss-web PUBLIC
"-//JBoss//DTD Web Application 2.3//EN"
"http://www.jboss.org/j2ee/dtd/jboss-web_3_0.dtd">
<jboss-web>
<security-domain>java:/jaas/myLogin</security-domain>
</jboss-web>
[/XML]
Mit der jboss.xml im EJB-Projekt fliegen jetzt Exceptions:
Java:
javax.faces.FacesException: #{ManagedBean.protectedAction}: javax.ejb.EJBAccessException: Authentication failure
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
javax.faces.component.UICommand.broadcast(UICommand.java:387)
javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:475)
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:755)
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
javax.faces.el.EvaluationException: javax.ejb.EJBAccessException: Authentication failure
javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
javax.faces.component.UICommand.broadcast(UICommand.java:387)
javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:475)
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:755)
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
javax.ejb.EJBAccessException: Authentication failure
org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.handleGeneralSecurityException(Ejb3AuthenticationInterceptor.java:68)
org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:70)
org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:110)
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46)
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:240)
org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:210)
org.jboss.ejb3.stateless.StatelessLocalProxy.invoke(StatelessLocalProxy.java:84)
$Proxy94.doSomeEditorStuff(Unknown Source)
testweb.ManagedBean.doBeanEditorAction(ManagedBean.java:53)
testweb.ManagedBean.protectedAction(ManagedBean.java:29)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.apache.el.parser.AstValue.invoke(AstValue.java:131)
org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
javax.faces.component.UICommand.broadcast(UICommand.java:387)
javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:475)
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:755)
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
Also, wie funktioniert die Weitergabe der principals?
Palador