2014-01-19 7 views
7


Invoke EJB von Wildfly sicher

Ich versuche, meine alte Anwendung in Unternehmen neu zu schreiben, "business" Art und Weise.
Also, ich habe einen Swing-Client mit Login-Modul und meinen eigenen Server von Grund auf neu erstellt. Der Client verwendet ein SSL-Zertifikat, um die TCP-Verbindung zum Server zu verschlüsseln (ich überprüfe das Client-Zertifikat auf dem Server und das Server-Zertifikat auf dem Client) und dann den Server zu verwenden, um den Benutzer zu authentifizieren und zu autorisieren.

Jetzt versuche ich es mit ejb von WildFly 8 CR1 gehostet zu arbeiten. Ich möchte das gleiche Client-Server-Schlüsselpaar verwenden, um den Swing-Client mit dem WildFly-Server zu verbinden und dann den Benutzer mit dem Namen und den Anmeldeinformationen zu authentifizieren, die in der MySQL-Datenquelle gespeichert sind. Ich habe auch Rollen in der Datenbank gespeichert und ich möchte sie verwenden, um Client-Prinzipale zu konfigurieren.

Ich habe einfache, grundlegende EJB-Aufruf:

Context ctx = new InitialContext(); 
MyBeanRemote bean = (MyBeanRemote)ctx.lookup("AppName/module-0.0.1-SNAPSHOT/MyBean!my.app.MyBeanRemote"); 
ResultType result = bean.doSomething(); 

Ich habe jndi.properties

java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory 
java.naming.provider.url=http-remoting://myServer:8080 
jboss.naming.client.ejb.context=true 
java.naming.security.principal=app-user-name 
[email protected] 

-Datei und ich habe grundlegende Datenquelle Konfiguration

<datasource jta="false" jndi-name="java:jboss/datasources/MyDB" pool-name="MyDB" enabled="true" use-ccm="false"> 
<connection-url>jdbc:mysql://localhost:3306/Mydb</connection-url> 
<driver-class>com.mysql.jdbc.Driver</driver-class> 
<driver>mysql-connector-java-5.1.28-bin.jar</driver> 
<security> 
    <user-name>mysqlUser</user-name> 
    <password>mysqlPass</password> 
</security> 
<validation> 
    <validate-on-match>false</validate-on-match> 
    <background-validation>false</background-validation> 
</validation> 
<statement> 
    <share-prepared-statements>false</share-prepared-statements> 
</statement> 
</datasource> 

Alles oben funktioniert gut.

ich einige Führer gelesen haben, aber noch nicht das finden haben beschrieben, wie der verwenden Composite: EJB (nicht Internet) + Wildfly 8 (nicht JBoss 7) + Verschlüsselung durch SSL + authentifizieren und Autorisierung über Datenquelle mit Login Client Modul

Jede Hilfe wird geschätzt.

Sorry für mein Englisch, verwende ich oft diese Sprache zum Lesen, nicht zu schreiben :)

Antwort

2

Sie würden neet ein Sicherheitsbereich zu Ihrem Remote Stecker in der standalone.xml Datei, wie solcher kartiert zu erstellen:

<management> 
    <security-realms> 
    <security-realm name="MyRealm"> 
     <authentication> 
     <jaas name="my-domain"/> 
     </authentication> 
    </security-realm> 
</management> 

<subsystem xmlns="urn:jboss:domain:remoting:1.1"> 
    <connector name="remoting-connector" socket-binding="remoting" security-realm="MyRealm"/> 
</subsystem> 

Dann sollten Sie die Sicherheitsdomäne mit einem richtigen Loginmodule (ein eingebauter in einem, oder Ihren eigenen) aktivieren:

<security-domains> 
    <security-domain name="my-domain" cache-type="default"> 
     <authentication> 
      <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required"> 
       <module-option name="dsJndiName" value="java:jboss/datasources/serviceDS"/> 
       <module-option name="principalsQuery" value="SELECT identificationCode FROM devices WHERE name=?"/> 
       <module-option name="rolesQuery" value="SELECT 'device', 'Roles' FROM devices WHERE name=?"/> 
      </login-module> 
     </authentication> 
    </security-domain> 
</security-realms> 

Of Natürlich sollte die Datenquelle auf eine Datenbank verweisen, in der die Abfragen die richtigen Principals (Benutzer) und ihre Rollen finden würden. Achten Sie darauf, zwei Artikel über Remoting zu überprüfen: https://docs.jboss.org/author/display/AS71/Remote+EJB+invocations+via+JNDI+-+EJB+client+API+or+remote-naming+project und https://docs.jboss.org/author/display/AS71/EJB+invocations+from+a+remote+client+using+JNDI. Es scheint, als ob Sie das "alte" Remoting verwenden - das Client-Login-Modul wird von JBoss 7 nicht mehr unterstützt. Die Quintessenz ist, dass Ihre ejb-Remoting-Konfiguration mehr wie folgt aussehen sollte (beachten Sie die lokalen Benutzer, die nicht zugelassen sind!):

remote.connections=default 
remote.connection.default.host=localhost 
remote.connection.default.port=8080 
remote.connection.default.username=userName 
remote.connection.default.password=password 
remote.connection.default.connect.options.org.xnio.Options.SASL_DISALLOWED_MECHANISMS=JBOSS-LOCAL-USER 
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT=false 

Seien Sie sicher, schließlich https://github.com/wildfly/quickstart/tree/master/ejb-remote

zu überprüfen, müssen Sie seine Sicherheitsdomäne Mapping in Ihrem jboss-ejb3 hinzuzufügen.xml:

<jboss:ejb-jar> 
    <assembly-descriptor> 
    <s:security>  
     <ejb-name>*</ejb-name>  
     <s:security-domain>my-domain</s:security-domain>  
    </s:security> 
    </assembly-descriptor> 
</jboss:ejb-jar 
+0

Danke für Ihre Antwort. Soweit ich weiß, verwendet die CR1-Version von WildFly den Port 4447 überhaupt nicht. Ich wollte eine neue Version von ejb lookup verwenden, aber es hat einfach nicht funktioniert. – Kaskader

+0

Ja, Sie haben Recht - mein Schlechter - Ich habe den neuen HTTP-Upgrade-Mechanismus vergessen. Es ist jetzt 8080 - ich habe die Post repariert. Mein Punkt war, dass Sie nicht den neuen Remoting-Stack verwenden - daher die Links zu den Artikeln für JBoss 7. Ein minimaler Satz von Attributen für ein funktionierendes Remoting wäre: remote.connections = default remote.connection.default.host = localhost remote.connection.default.port = 8080. Ich habe auch einen Link zum Schnellstart für ejb-remoting von wildfly hinzugefügt. Es ist nicht für CR 1, sollte aber funktionieren (funktioniert bei mir nach dem Update der Versionen in pom auf 8.0.0.CR1) – mcmil

+0

Leider funktioniert es nicht. Ich habe Sicherheitsbereich und Domäne wie von Ihnen vorgeschlagen angegeben. In Domäne: Remoting habe ich ' '. Ihre Version verursacht einen Serverabsturz beim Start. Dann füllte ich jboss-ejb3.xml und jboss-ejb-client.properties wie Sie vorgeschlagen hatten und hinterließen nur 'java.naming.factory.url.pkgs = org.jboss.ejb.client.naming' und' java.naming. factory.initial = org.jboss.naming.remote.client.InitialContextFactory'. Jetzt habe ich eine Ausnahme bei der Kontextinitialisierung – Kaskader

Verwandte Themen