Una volta creati i nostri servizi ci preoccuperemo di applicare delle policy di sicurezza al fine impedirne l’utilizzo a utenti non autorizzati
Le policy di sicurezza si basano su 3 aspetti:
- l’autenticazione
- la firma
- la crittografia
Implementando meccanismi di autenticazione si limita l’accesso ad utenti conosciuti dal sistema, con l’utilizzo della firma si certifica un contenuto e con la crittografia si trasforma il flusso di dati in un flusso impossibile da leggere senza l’opportuna chiave.
Nell’articolo di oggi vedremo gli strumenti che offre Spring-ws per gestire l’autenticazione.
Spring-ws mette a disposizione 2 implementazioni dell’interfaccia Interceptor:
- XwsSecurityInterceptor basato sull’implementazione della SUN XWSS Xml and Web Service Security
- Wss4jSecurityInterceptor basato sull’implementazione di Apache WSS4J
Per iniziare vedremo il caso di autenticazione più semplice, ovvero quello che prevede di inviare come header della soap un tag chiamato UsernameToken che prevede 2 attributi in chiaro contenenti username e password.
E’ un meccanismo molto semplice da usare che va abbinato ad altre tecniche come la crittografia, visto che l’invio in chiaro dei dati di accesso non è cosa bella.
Scegliamo di usare l’implementazione XwsSecurityInterceptor, che prevede la definizione di un file contenente le policy di sicurezza.
All’interno del file definiamo la regola di sicurezza
1 2 3 4 5 |
<xwss:SecurityConfiguration dumpMessages="false" xmlns:xwss="http://java.sun.com/xml/ns/xwss/config"> <xwss:RequireUsernameToken passwordDigestRequired="false" nonceRequired="false"/> </xwss:SecurityConfiguration> |
Stiamo dicendo al nostro modulo che ogni richiesta per essere accettata deve contenere il token UsernameToken, che la password non deve essere crittografata e che non è richiesto il nonce. Per maggiori dettagli sugli attributi del token Username rimando alle specifiche di SUN. Per informazioni sul Nonce ripassate concetti di crittografia.
A questo punto definiamo l’interceptor e le sue regole
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<bean id="wsSecurityInterceptor" class="org.springframework.ws.soap.security.xwss.XwsSecurityInterceptor"> <property name="policyConfiguration" value="classpath:securityPolicy.xml"/> <property name="callbackHandlers"> <list> <ref bean="passwordValidationHandler"/> </list> </property> </bean> <bean id="passwordValidationHandler" class="org.springframework.ws.soap.security.xwss. callback.SimplePasswordValidationCallbackHandler"> <property name="users"> <props> <prop key="Valerio">Finazzo</prop> </props> </property> </bean> |
Il nostro interceptor carica le regole da applicare dal file di policy definito precedentemente, mentre con il bean passwordValidationHandler definiamo gli utenti che possono accedere ai nostri servizi, in questo caso username/password Valerio/Finazzo
Qualora nella nostra richiesta non sia presente il token usernameToken il server genera un FAULT specificando l’errore.
Per testare quanto fatto consiglio SoapUi con cui potete creare agevolmente le request e aggiungere gli header per la sicurezza, ottenendo qualcosa del genere
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<soapenv:Envelope xmlns:sch="http://www.example.org/schema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header><wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> <wsse:UsernameToken wsu:Id="UsernameToken-14" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <wsse:Username>Valerio</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"> Finazzo</wsse:Password> </wsse:UsernameToken></wsse:Security> </soapenv:Header> <soapenv:Body> <sch:RicercaLibroRequest> <!--Optional:--> <sch:titolo>?</sch:titolo> <!--Optional:--> <sch:nome>?</sch:nome> <!--Optional:--> <sch:cognome>?</sch:cognome> </sch:RicercaLibroRequest> </soapenv:Body> </soapenv:Envelope> |
Nel prossimo articolo vedremo tecniche più avanzate per gestire l’autenticazione.