Ho una Java-Webapp in esecuzione su Wildfly 8. Cerco di proteggere il mio restful webservice con Restoty Annotations. Io uso il curl dello strumento da riga di comando per testare l'api di riposo.Wildfly 8 Basic Authentication
La configurazione di autenticazione di base sembra funzionare. Le richieste HTTP ai servizi Web con annotazione "@PermitAll" funzionano correttamente. Curl dice:
~ % curl -v http://localhost:8080/ItilityServer-web/rest/account
> GET /ItilityServer-web/rest/account HTTP/1.1
> User-Agent: curl/7.40.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Connection: keep-alive
< X-Powered-By: Undertow/1
< Server: WildFly/8
< Content-Length: 0
< Date: Wed, 28 Jan 2015 10:47:11 GMT
<
* Connection #0 to host localhost left intact
Ma le richieste HTTP contenenti nome utente e password validi vengono rifiutate con codice di stato 401 non autorizzato. Wildfly registra l'errore password senza eguali:
2015-01-28 11:42:43,565 TRACE [org.jboss.security] (default task-5) PBOX000263: Executing query SELECT a.password FROM Account a WHERE a.name = ? with username hans
2015-01-28 11:42:43,566 DEBUG [org.jboss.security] (default task-5) PBOX000283: Bad password for username hans
Ma questo non è vero. I dettagli dell'autorizzazione decodificata "aGFuczpoZWxtaWhlbG1paGVsbWk =" sono hans: helmihelmihelmi e questo nome utente e password sono memorizzati nel mio db. Le stesse query jpql utilizzate dal dominio di sicurezza danno come risultato uno "hans" non identificabile e la sua password "helmihelmihelmi".
Qui la mia messa a punto:
web.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<context-param>
<param-name>resteasy.role.based.security</param-name>
<param-value>true</param-value>
</context-param>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Application</realm-name>
</login-config>
<security-role>
<role-name>store</role-name>
</security-role>
</web-app>
(non so cosa ambiti di sicurezza sono, quindi ho appena lasciato questa proprietà nel tag login-config)
Il mio dominio di sicurezza in standalone.xml
<security-domain name="DBLogin" cache-type="default">
<authentication>
<login-module code="Database" flag="required">
<module-option name="dsJndiName" value="java:jboss/datasources/ExampleDS"/>
<module-option name="principalsQuery" value="SELECT a.password FROM Account a WHERE a.name = ?"/>
<module-option name="rolesQuery" value="SELECT a.userRole FROM Account a WHERE a.name = ?"/>
<module-option name="hashAlgorithm" value="SHA-256"/>
<module-option name="hashEncoding" value="Base64"/>
<module-option name="hashCharset" value="UTF-8"/>
<module-option name="unauthenticatedIdentity" value="guest"/>
</login-module>
</authentication>
</security-domain>
webservice riposante
@GET
@RolesAllowed(AuthRole.STORE)
@Produces(MediaType.APPLICATION_JSON)
public Response getAccountByName() {
Response.ResponseBuilder builder = Response.ok();
return builder.build();
}
e import.xml creare l'utente all'avvio
insert into Account(id, name, email, password, user_role) values (0, 'hans', '[email protected]', 'helmihelmihelmi', 'store')
insert into Store(id, name, zipcode, street, housenumber, town, account_id) values(0, 'Edeka', 72622, 'stephanstraße', 10, 'Reudern', 0);
Non so come trovare una soluzione, perché io non so nemmeno il problema. Spero che qualcuno possa aiutarti.
Questa era la soluzione! Molte grazie. – Helmosch
L'IMHO che memorizza una password hash grezza o non sicura deve essere considerata negligenza criminale in questi giorni. –