2015-01-28 13 views
6

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.

risposta

4

Non è necessario memorizzare la password non crittografata nel database. WildFly prevede di archiviare la password con hash, utilizzando l'algoritmo hash e la codifica specificati nella configurazione login-module.

Quando si crea una nuova Account, utilizzare

org.jboss.security.auth.spi.Util.createPasswordHash() 

per ottenere la password hash per memorizzare.

Come regola generale, la memorizzazione di password non elaborate costituisce un rischio per la sicurezza.

+0

Questa era la soluzione! Molte grazie. – Helmosch

+0

L'IMHO che memorizza una password hash grezza o non sicura deve essere considerata negligenza criminale in questi giorni. –