# principal von webapp -> ejb



## palador (2. Feb 2011)

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:


```
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:


```
FacesContext.getCurrentInstance().getExternalContext().isUserInRole("editor");
```

Jetzt möchte ich in der EJB den Zugriff zusätzlich absichern:

```
@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:

```
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


----------



## palador (3. Feb 2011)

ok, habs selbst gefixt.

Mein Problem lag in der login-config.xml.
Das Loginmodul UsersRolesLoginModule funktioniert nicht, wenn zwei Applikationen auf eine application-policy zugreifen (warum?). Mit nur dem Webprojekt gehts, das EJBProjekt will aber nicht. Egal. Habe auf das Datenbankmodul umgeschwenkt.


----------



## FArt (7. Feb 2011)

palador hat gesagt.:


> ok, habs selbst gefixt.
> 
> Mein Problem lag in der login-config.xml.
> Das Loginmodul UsersRolesLoginModule funktioniert nicht, wenn zwei Applikationen auf eine application-policy zugreifen (warum?). Mit nur dem Webprojekt gehts, das EJBProjekt will aber nicht. Egal. Habe auf das Datenbankmodul umgeschwenkt.



Das kann nicht sein! Entweder ein Fehler in der Verwendung oder ein Bug im JBoss (zweiteres eher unwahrscheinlich).


----------



## palador (7. Feb 2011)

Ich findes auch komisch. Nun wird der Fehler nicht so oft auftreten, weil das UsersRolesLoginModule sowieso nur für Tutorialzwecke verwendet werden sollte. Oder gibt es reale Anwendungen die darauf zurückgreifen?

Auf jeden Fall habe ich aber nichts weiter geändert. Nur halt in der login-config.xml ein neues Modul unter gleichen Namen eingerichtet und das alte auskommentiert. Weil ich es selbst nicht glauben konnte, habe ich es nochmal getauscht -> geht nicht. Dann erstmal nur mit einer Anwendung darauf zugegriffen -> geht.

Keine Ahnung, woran das liegen könnte.

Aber wenn jemand anders an der gleichen Stelle hängen bleibt, sollte er mal ein anderes Loginmodul testen.


----------

