<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Blogs - Schnuffel</title>
		<link>https://www.developpez.net/forums/blogs/319630-schnuffel/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Tue, 14 Apr 2026 12:38:20 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.jpg</url>
			<title>Forum du club des développeurs et IT Pro - Blogs - Schnuffel</title>
			<link>https://www.developpez.net/forums/blogs/319630-schnuffel/</link>
		</image>
		<item>
			<title>Sécuriser ses Webservices avec Apache CXF et Wss4j</title>
			<link>https://www.developpez.net/forums/blogs/319630-schnuffel/b279/securiser-webservices-apache-cxf-wss4j/</link>
			<pubDate>Mon, 02 Mar 2015 16:52:33 GMT</pubDate>
			<description>Bonjour, 
 
Si vous aussi...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Bonjour,<br />
<br />
Si vous aussi vous luttez pour créer des Webservices sécurisés, voici quelques astuces que j'ai découvertes au fur et à mesures de mes pérégrinations. Je mettrai à jour ce billet dès que je découvre de nouveaux trucs. À ce jour, je ne parle que de la partie client.<br />
<br />
J'utilise ici Apache CXF 3.0.4 et Spring 3.1.13.RELEASE.<br />
<br />
Mon objectif est de parvenir à tout configurer via la applicationContext.xml (à en coder le moins possible !).<br />
<br />
D'abord, ce qu'il faut comprendre, c'est que Apache CXF utilise des intercepteurs afin de sécuriser les Webservices.<br />
<br />
Qu'est-ce qu'un intercepteur ? Il s'agit d'un processus qui va récupérer une requête que l'on souhaite envoyer et réaliser une action dessus.<br />
<br />
Cette action peut être soit de rajouter/supprimer/modifier des éléments de la requête, soit de la logger, etc.<br />
<br />
Comment rajouter des intercepteurs ?<br />
Il suffit de rajouter les classes d'intercepteur dans les listes d'intercepteurs de requêtes entrantes (inInterceptor) ou sortantes (outInterceptor)<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br /></div></td><td valign="top"><pre style="margin: 0">&lt;bean id=&quot;clientFactory&quot; class=&quot;org.apache.cxf.jaxws.JaxWsProxyFactoryBean&quot;&gt;
		&lt;property name=&quot;serviceClass&quot; value=&quot;serviceType&quot; /&gt;
		&lt;property name=&quot;address&quot;
			value=&quot;http://adresse&quot; /&gt;
		&lt;property name=&quot;inInterceptors&quot;&gt;
			&lt;list&gt;
				&lt;ref bean=&quot;logIn&quot; /&gt;
				&lt;ref bean=&quot;signResponse&quot; /&gt;
			&lt;/list&gt;
		&lt;/property&gt;
		&lt;property name=&quot;outInterceptors&quot;&gt;
			&lt;list&gt;
				&lt;ref bean=&quot;logOut&quot; /&gt;
				&lt;ref bean=&quot;saajOut&quot; /&gt;
				&lt;ref bean=&quot;signRequest&quot; /&gt;
			&lt;/list&gt;
		&lt;/property&gt;
	&lt;/bean&gt;</pre></td></tr></table></pre>
</div>Et donc, pour sécuriser le Webservices, il faut ajouter un intercepteur qui va rajouter le header de sécurité. Voici un exemple :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br /></div></td><td valign="top"><pre style="margin: 0">&lt;bean id=&quot;signRequest&quot; class=&quot;org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor&quot;&gt;
		&lt;constructor-arg&gt;
			&lt;map&gt;
				&lt;entry key=&quot;action&quot; value=&quot;UsernameToken Timestamp Signature Encrypt&quot; /&gt;
				&lt;entry key=&quot;user&quot; value=&quot;laurent&quot; /&gt;
				&lt;entry key=&quot;passwordType&quot; value=&quot;PasswordText&quot; /&gt;
				&lt;entry key=&quot;signatureUser&quot; value=&quot;serverwsalias&quot; /&gt;
				&lt;entry key=&quot;encryptionUser&quot; value=&quot;serverwsalias&quot; /&gt;
				&lt;entry key=&quot;passwordCallbackClass&quot; value=&quot;main.ClientPasswordCallback&quot; /&gt;
				&lt;entry key=&quot;signaturePropFile&quot; value=&quot;/crypt.properties&quot;&gt;&lt;/entry&gt;
				&lt;entry key=&quot;signatureParts&quot;
					value=&quot;{Element}{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd}Timestamp;Body&quot; /&gt;
				&lt;entry key=&quot;encryptionPropFile&quot; value=&quot;/crypt.properties&quot;&gt;&lt;/entry&gt;
				&lt;entry key=&quot;encryptionParts&quot;
					value=&quot;{Element}{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}UsernameToken;Body&quot; /&gt;
			&lt;/map&gt;
		&lt;/constructor-arg&gt;
	&lt;/bean&gt;</pre></td></tr></table></pre>
</div>Ici, on utilise un intercepteur qui nous est fournis par CXF et qui utilise WSS4J.<br />
<br />
Dans les actions, on définit les différentes actions que devra réaliser l'intercepteur. Ici, on a UsernameToken (authentification par username/mot de passe), Timestamp (la date de création et d'expiration de la requête va être indiquée), Signature (on va signer le message afin d'assurer l'identité de l’émetteur) et Encrypt (on va crypter la requête).<br />
L'ordre a une importance ! les actions a b c d seront dans la requêtes sous la forme<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0">&lt;header&gt;
    &lt;d&gt;…&lt;/d&gt;
    &lt;c&gt;…&lt;/c&gt;
    &lt;b&gt;…&lt;/b&gt;
    &lt;a&gt;…&lt;/a&gt;
&lt;/header&gt;</pre></td></tr></table></pre>
</div>Remarques en vrac :<br />
- Si &quot;signatureUser&quot; n'est pas spécifier, il utilisera la valeur de &quot;user&quot;<br />
- pour &quot;passwordCallbackClass&quot;, on doit créer une classe qui implémente la classe CallbackHandler afin de donner un mode passe pour un user donné. CXF s'occupe ensuite de comparer.<br />
- Pour &quot;signatureParts&quot; et &quot;encryptionParts&quot;, il faut spécifier les différents éléments de la requêtes XML qui seront signés ou crypter, séparé par un &quot;;&quot;. Il se construise de la façon suivante : {Element}{adresse du xsd qui définit l'attribut XML}Id_de_l'attribut.<br />
<br />
Voilà, j'espère que ça pourra aider certaines personnes.</blockquote>

]]></content:encoded>
			<dc:creator>Schnuffel</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/319630-schnuffel/b279/securiser-webservices-apache-cxf-wss4j/</guid>
		</item>
	</channel>
</rss>
