Von Tomcat-Servlet auf JBoss-EJB zugreifen mit Sicherheit

GFEMajor

Grünschnabel
Kurze Beschreibung:

Ich schütze meine WebApp zur Zeit über einen Eintrag in der Web.xml meiner Anwendung um mich am Tomcat anzumelden:

Code:
 <resource-env-ref>
    <description>
      Link to the UserDatabase instance from which we request lists of
      defined role names.  Typically, this will be connected to the global
      user database with a ResourceLink element in server.xml or the context
      configuration file for the Manager web application.
    </description>
    <resource-env-ref-name>users</resource-env-ref-name>
    <resource-env-ref-type>
      org.apache.catalina.UserDatabase
    </resource-env-ref-type>
  </resource-env-ref>


<security-constraint>
	<display-name>MyApp</display-name>
	<web-resource-collection>
		<web-resource-name>MyApp</web-resource-name>
		<url-pattern>/*</url-pattern>			
	</web-resource-collection>
	<auth-constraint>
		<role-name>FBUser</role-name>
	</auth-constraint>
</security-constraint>
	
<login-config>
	<auth-method>BASIC</auth-method>
	<realm-name>Username</realm-name>
</login-config>

<security-role>
	<role-name>FBUser</role-name>
</security-role>

Das Funktioniert auch wunderbar. Nun möchte ich aber aus einem Servlet, dass auf dem Tomcat läuft ein EJB auf einem JBoss ansprechen. Wenn ich das versuche, dann bekomme ich im Tomcat folgende Fehlermeldung:

Code:
SCHWERWIEGEND: Exception while dispatching incoming RPC call
com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract de.myPackage.myApp.client.business.FBUser de.myPackage.myApp.client.MyAppRemoteService.login(java.lang.String,java.lang.String)' threw an unexpected exception: javax.ejb.EJBAccessException: Authentication failure
	at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:360)
	at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:546)
	at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:166)
	at com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost(RemoteServiceServlet.java:86)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Thread.java:619)
Caused by: javax.ejb.EJBAccessException: Authentication failure
	at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.handleGeneralSecurityException(Ejb3AuthenticationInterceptor.java:68)
	at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:70)
	at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:108)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:280)
	at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106)
	at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
	at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:866)
	at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:608)
	at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:406)
	at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:173)
Caused by: javax.security.auth.login.FailedLoginException: Password Incorrect/Password Required
	at org.jboss.security.auth.spi.UsernamePasswordLoginModule.login(UsernamePasswordLoginModule.java:213)
	at org.jboss.security.auth.spi.UsersRolesLoginModule.login(UsersRolesLoginModule.java:152)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at javax.security.auth.login.LoginContext.invoke(Unknown Source)
	at javax.security.auth.login.LoginContext.access$000(Unknown Source)
	at javax.security.auth.login.LoginContext$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.login.LoginContext.invokePriv(Unknown Source)
	at javax.security.auth.login.LoginContext.login(Unknown Source)
	at org.jboss.security.plugins.JaasSecurityManager.defaultLogin(JaasSecurityManager.java:603)
	at org.jboss.security.plugins.JaasSecurityManager.authenticate(JaasSecurityManager.java:537)
	at org.jboss.security.plugins.JaasSecurityManager.isValid(JaasSecurityManager.java:344)
	at org.jboss.aspects.security.AuthenticationInterceptor.authenticate(AuthenticationInterceptor.java:123)
	at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:66)
	at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:108)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:280)
	at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106)
	at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
	at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:866)
	at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:608)
	at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:406)
	at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:173)
	at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:174)
	at org.jboss.remoting.Client.invoke(Client.java:1640)
	at org.jboss.remoting.Client.invoke(Client.java:554)
	at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:62)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:61)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.aspects.security.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:53)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:74)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:107)
	at $Proxy0.verifyFBUser(Unknown Source)
	at de.myPackage.myApp.server.MyAppRemoteServiceImpl.login(MyAppRemoteServiceImpl.java:74)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:527)
	at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:166)
	at com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost(RemoteServiceServlet.java:86)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Thread.java:619)
	at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:74)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:61)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.aspects.security.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:53)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:74)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:107)
	at $Proxy0.verifyFBUser(Unknown Source)
	at de.myPackage.myApp.server.MyAppRemoteServiceImpl.login(MyAppRemoteServiceImpl.java:74)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:527)
	at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:166)
	at com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost(RemoteServiceServlet.java:86)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Thread.java:619)

Das EJB selbst sollte, nur zu testzwecken natürlich, sich über den Sicherheitsbereich der jmx-console anmelden. Dazu folgende configuration in der jboss.xml im EJB:
Code:
<?xml version="1.0" encoding="UTF-8"?>
 
 <jboss>
    <!-- Sicherheit -->
    <security-domain>java:/jaas/jmx-console</security-domain>
 </jboss>

und hier die Konfiguration der jmx-console:
jmx-console-roles.properties:
Code:
# A sample roles.properties file for use with the UsersRolesLoginModule
admin=JBossAdmin,HttpInvoker
tomcat=FBUser,JBossAdmin,HttpInvoker

und die jmx-console-users.properties:
Code:
# A sample users.properties file for use with the UsersRolesLoginModule
admin=*****
tomcat=tomcat
Mit dem Benutzernamen "tomcat" und dem Passwort "tomcat" melde ich mich auch am Tomcatserver selbst an.
Wenn ich dann im Servlet, dass den Aufruf am EJB macht folgendes ausführe:
Code:
log.warn("Prinzipal: " + this.getThreadLocalRequest().getUserPrincipal().getName());
log.warn("InRole \"FBUser\"?:" + this.getThreadLocalRequest().isUserInRole("FBUser"));
wird mir auch angezeigt, dass ich mich mit dem Benutzer "tomcat" und der Rolle "FBUser" angemeldet habe.

Nun ist meine Frage, warum funktioniert das nicht? Ist da was falsch konfiguriert? Und wenn ja was :)?

Zu meiner Konfiguration:
Tomcat 6.0.20 auf localhost:2428
JBoss mit der EJB 3.0 auf localhost:8080
zur Entwicklung der WebApp Google Web Toolkit 1.6.4


Ich hoffe mir kann jemand helfen.
 
Hallo,

wie es aussieht werden die Anmeldeinformationen nicht vom externen Tomcat an den JBoss übertragen. Wie hast du das den realisiert (ist aus dem Beispiel jetzt nicht so klar ersichtlich)?

Hat es eigentlich einen speziellen Grund, dass du einen externen Tomcat benutzt und nicht den integrierten?

Grüße
THMD
 
Jap, genau da sehe ich auch das Problem.

Mein Ansatz war bis jetzt einfach das EJB aufzurufen.

Code:
InitialContext ctx;
			try {
				ctx = new InitialContext();
				
				connector = (MyBean) ctx.lookup("java:comp/env/ejb/MyBean");
			} catch (NamingException e) {
				log.error("Fehler beim initialisieren des Connectors", e);
			}

Wie kann ich denn die Inforationen vom Tomcat an den JBoss übertragen?

Hat es eigentlich einen speziellen Grund, dass du einen externen Tomcat benutzt und nicht den integrierten?

Ja, die WebApp soll am Ende auf einer anderen Maschiene laufen als der JBoss wo die EJB drauf sind.
 
Zuletzt bearbeitet:
Hallo,

also einfach das EJB aufzurufen reicht nicht, wenn du mit einem Client remote auf geschützte EJB's zugreifst. Du muss dem Server schon irgenwie mitteilen, wer du bist.

Prinzipiell gibts dafür mehrere Möglichkeiten. Du könntest einen programatischen Login per JAAS machen, oder (zumindest bis JBoss 4) eine von den speziellen InitialContextFactories benutzen (JndiLoginInitialContextFactory, LoginInitialContextFactory). Ab JBoss 5 funktionieren die Factories nicht mehr wirklich, da kannst du dann den SecurityClient benutzen. Als Startpunkte zum lesen , die Security-FAQ von JBoss und etwas über den SecurityClient. Ansonsten solltest du hier im Forum auch noch genug zu dem Thema finden.;)


GEFMAJOR hat gesagt.:
Ja, die WebApp soll am Ende auf einer anderen Maschiene laufen als der JBoss wo die EJB drauf sind.
ja, das ist mir schon klar ;). Was ich damit sagen wollte - wenn es keinen Grund gibt, dass die getrennt laufen sollen, wäre es imho besser, sie zusammen zu lassen. Zum einen ist es einfacher zu konfigurieren (z.B. bei Security) und zum anderen ist es im Normalfall performanter.

Grüße
THMD
 
Danke schonmal für deine Antwort. ich wusste doch ich hab was übersehen :).

Also, mein Versuch:

Ich habe beim Aufruf des EJB folgendes hinzugefügt:

Java:
Properties env = new Properties();
// Try with a login that should succeed
env.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.jboss.security.jndi.LoginInitialContextFactory");
env.setProperty(Context.SECURITY_CREDENTIALS, "tomcat");
env.setProperty(Context.SECURITY_PRINCIPAL, "tomcat");
env.setProperty(Context.SECURITY_PROTOCOL, "jmx-console");

			
InitialContext ctx;
try {
	ctx = new InitialContext(env);
				
	connector = (MyBean) ctx.lookup("java:comp/env/ejb/MyBean");
	return true;
} catch (NamingException e) {
	log.error("Fehler beim initialisieren des Connectors", e);
}

aber wenn ich es so versuche, erhalte ich folgende Fehlermeldung im Tomcat:

Java:
SCHWERWIEGEND: Exception while dispatching incoming RPC call
com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract java.lang.Boolean de.myPackage.MyApp.client.MyAppRemoteService.printPrincipal()' threw an unexpected exception: java.lang.SecurityException: Anmeldekonfiguration kann nicht gefunden werden.
	at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:360)
	at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:546)
	at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:166)
	at com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost(RemoteServiceServlet.java:86)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.SecurityException: Anmeldekonfiguration kann nicht gefunden werden.
	at com.sun.security.auth.login.ConfigFile.<init>(ConfigFile.java:93)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at java.lang.Class.newInstance0(Class.java:355)
	at java.lang.Class.newInstance(Class.java:308)
	at javax.security.auth.login.Configuration$3.run(Configuration.java:246)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.login.Configuration.getConfiguration(Configuration.java:241)
	at javax.security.auth.login.LoginContext$1.run(LoginContext.java:237)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.login.LoginContext.init(LoginContext.java:234)
	at javax.security.auth.login.LoginContext.<init>(LoginContext.java:403)
	at org.jboss.security.jndi.LoginInitialContextFactory.getInitialContext(LoginInitialContextFactory.java:86)
	at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
	at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
	at javax.naming.InitialContext.init(InitialContext.java:223)
	at javax.naming.InitialContext.<init>(InitialContext.java:197)
	at de.myPackage.MyApp.server.MyAppRemoteServiceImpl.initConnectorInstance(MyAppRemoteServiceImpl.java:45)
	at de.myPackage.MyApp.server.MyAppRemoteServiceImpl.printPrincipal(MyAppRemoteServiceImpl.java:76)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:527)
	... 17 more
Caused by: java.io.IOException: Anmeldekonfiguration kann nicht gefunden werden.
	at com.sun.security.auth.login.ConfigFile.init(ConfigFile.java:250)
	at com.sun.security.auth.login.ConfigFile.<init>(ConfigFile.java:91)
	... 42 more

Irgendwelche Ideen?

BWT: Gibt es auch eine Lösung die nicht hartcodiert im Quelltext ist, sondern irgendwie über Konfigurationsdateien läuft?
 
Ich habs nochmal mit folgendem probiert:

Java:
Properties env = new Properties();
env.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.security.jndi.JndiLoginInitialContextFactory");
env.setProperty(Context.SECURITY_PRINCIPAL, "tomcat");
env.setProperty(Context.SECURITY_CREDENTIALS, "tomcat");

und siehe da, es geht. Aber wie schon im obigen Post:

BWT: Gibt es auch eine Lösung die nicht hartcodiert im Quelltext ist, sondern irgendwie über Konfigurationsdateien läuft?

stellt mich diese Lösung nicht so richtig zufrieden.
Mein Problem ist, wenn das EJB jetzt auf einen anderen Server umzieht, der nicht mehr JBoss ist, sondern zum Beispiel Glassfish, dann muss ich hier im Code sachen ändern. Da hat zur folge das der Komplette Code der Anwendung neu compiliert werden und durch den Qualitätssicherungsprozess muss.
Schöner wäre es, wenn man die ganze Sache irgendwie über Konfigurationsdateien lösen könnte. Ist das denn überhaupt möglich?
 
Hallo,

und siehe da, es geht. Aber wie schon im obigen Post:

Zitat:
Zitat von GFEMajor
clear.gif


BWT: Gibt es auch eine Lösung die nicht hartcodiert im Quelltext ist, sondern irgendwie über Konfigurationsdateien läuft?
Du könntest auch eine Datei namens jndi.properties in den Classpath legen. In dieser Datei vermerkst du dann die Informationen für den JNDI-Context als Schlüsselwertpaare.


Anschließend brauchst du in deinem Code nur noch new InitialContext() aufzurufen. Dabei wird dann die jndi.properties im Classpath gesucht und für die Kontextkonfiguration verwendet.

Gruß Tom
 
Ok, das hilft mir etwas weiter. Nun wird es aber richtig kompliziert :).

Zur Zeit ist es ja so, dass ich mich am Tomcat anmelde und der die Anmeldung an den JBoss weiterreicht. Dabei müssen die User auf beiden Seiten mit den gleichen Rollen und Userdaten (Name+Passwort) vorhanden sein. (Also alles doppelt, was man ja in der Informatik vermeiden sollte ;)).

Ist es denn möglich den Tomcat so zu konfigurieren, dass er die Anmeldedaten vom JBoss mit nutzt, so das ich die ganzen Rollen und Nutzerdaten nur einmal anlegen und pflegen muss?

Wenn das auch noch geht, dann wäre ich was die Sicherheit angehet erstmal rundum glücklich :).

LG Major
 

Neue Beiträge

Zurück