WildFly remoting

Cette page a été rédigée il y a fort fort longtemps, et n'a pas tellement été mise à jour.

 

Vous savez, moi je ne crois pas qu'il y ait de bonne ou de mauvaise page. Moi, si je devais résumer mon wiki aujourd'hui avec vous, je dirais que c'est d'abord des rencontres. Des gens qui m'ont tendu la main, peut-être à un moment où je ne pouvais pas, où j'étais seul chez moi. Et c'est assez curieux de se dire que les hasards, les rencontres forgent une destinée... Parce que quand on a le goût de la chose, quand on a le goût de la chose bien faite, le beau geste, parfois on ne trouve pas l'interlocuteur en face je dirais, le miroir qui vous aide à avancer. Alors ça n'est pas mon cas, comme je disais là, puisque moi au contraire, j'ai pu ; et je dis merci au wiki, je lui dis merci, je chante le wiki, je danse le wiki... je ne suis qu'amour ! Et finalement, quand des gens me disent « Mais comment fais-tu pour avoir cette humanité ? », je leur réponds très simplement que c'est ce goût de l'amour, ce goût donc qui m'a poussé aujourd'hui à entreprendre une construction logicielle... mais demain qui sait ? Peut-être simplement à me mettre au service de la communauté, à faire le don, le don de soi.

Dans WildFly, on appelle remoting la technique qui permet de fait d’appeler des EJB ou du JMS depuis un client distant.

Depuis WildFly 8, on utilise un protocole spécifique qui s’appelle http-remoting. Il utilise le port HTTP (8080) et exploite la technique de l’UPGRADE.

Le remoting est activé par défaut, mais sans sécurité. Il peut donc être utile d’ajouter deux aspects de sécurité : l’authentification et le transport SSL.

La configuration décrite ci-dessous a été testée avec WildFly 10.1. Il est probable qu’elle ne marche plus à partir de WidlFly 11.

Client

Dépendances (EJB)

Sans outil de gestion de dépendance (Maven, Gradle,…​), la façon la plus simple d’avoir les bonnes classes coté client est d’utiliser le fichier $JBOSS_HOME/bin/client/jboss-client.jar.

Avec Maven, on peut déclarer la dépendance suivante :

 <dependency>
     <groupId>org.jboss</groupId>
     <artifactId>jboss-ejb-client</artifactId>
     <version>2.1.8.Final</version>
 </dependency>

Properties

L’accès au registre JNDI distant est configuré par un fichier jndi.properties.

# jndi.properties
java.naming.factory.url.pkgs=org.jboss.ejb.client.naming

Et l’accès aux EJB est configuré dans une autre fichier jboss-ejb-client.properties.

#jboss-ejb-client.properties
endpoint.name=client-endpoint
remote.connections=default
remote.connection.default.host=127.0.0.1
remote.connection.default.port=8080

Ces deux fichiers peuvent être remplacés par quelques lignes de code

Properties clientProperties = new Properties();
clientProperties.put("remote.connections", "default");
clientProperties.put("remote.connection.default.port", "8080");
clientProperties.put("remote.connection.default.host", "127.0.0.1");

EJBClientConfiguration ejbClientConfiguration = new PropertiesBasedEJBClientConfiguration(clientProperties);
ContextSelector<EJBClientContext> contextSelector = new ConfigBasedEJBClientContextSelector(ejbClientConfiguration);
EJBClientContext.setSelector(contextSelector);

Properties jndiProperties = new Properties();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
namingContext = new InitialContext(jndiProperties);

Cette première étape devrait permettre d’appeler des EJB distant, mais sans aucune sécurité.

Authentification

Client

endpoint.name=client-endpoint
remote.connections=default
remote.connection.default.host=127.0.0.1
remote.connection.default.port=8080

remote.connection.default.username=alexis
remote.connection.default.password=hassler

remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT=false
remote.connection.default.connect.options.org.xnio.Options.SASL_DISALLOWED_MECHANISMS=JBOSS-LOCAL-USER

Serveur

/core-service=management/security-realm=RemotingRealm:add
/core-service=management/security-realm=RemotingRealm/authentication=jaas:add(name=sw-domain)

/subsystem=remoting/http-connector=remoting-connector:add(connector-ref=default, security-realm=RemotingRealm)

SSL

Client

endpoint.name=client-endpoint
remote.connections=default
remote.connection.default.protocol=https-remoting   # Remoting on HTTPS
remote.connection.default.host=127.0.0.1
remote.connection.default.port=8443                 # HTTPS port
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT=false
remote.connection.default.connect.options.org.xnio.Options.SASL_DISALLOWED_MECHANISMS=JBOSS-LOCAL-USER

remote.connection.default.username=alexis
remote.connection.default.password=hassler

Serveur

/core-service=management/security-realm=RemotingRealm:add
/core-service=management/security-realm=RemotingRealm/authentication=jaas:add(name=sw-domain)

/subsystem=remoting/http-connector=ssl-remoting-connector:add(connector-ref=https, security-realm=RemotingRealm)