2009-10-23 6 views
19

Sono nuovo di JAX-WS e c'è una cosa che non capisco.JAX-WS e autenticazione BASIC, quando i nomi utente e le password sono in un database

C'è un sacco di tutorial disponibili su come impostare la sicurezza JAX-WS, ma in quasi tutti i casi BindingProvider.USERNAME_PROPERTY e BindingProvider.PASSWORD_PROPERTY sono memorizzati in alcuni file .xml (a seconda del contenitore che credo) - essi sono "hardcoded" cioè. E questo è quello che non capisco. Come posso autenticare un client di servizi Web confrontando BindingProvider.USERNAME_PROPERTY e BindingProvider.PASSWORD_PROPERTY con un nome utente e una password contenuti in un database? Ho provato a installare BindingProvider.USERNAME_PROPERTY e BindingProvider.PASSWORD_PROPERTY sul lato client in questo modo:

ShopingCartService scs = new ShopingCartService(wsdlURL, name); 
    ShopingCart sc = scs.getShopingCartPort(); 
    Map<String, Object> requestContext = ((BindingProvider)sc).getRequestContext(); 
    requestContext.put(BindingProvider.USERNAME_PROPERTY, userName); 
    requestContext.put(BindingProvider.PASSWORD_PROPERTY, password); 
    sc.someFunctionCall(); 

E poi, sul lato server recuperando in questo modo:

@Resource 
WebServiceContext wsContext; 

@WebMethod 
public void someFunctionCall() { 
    MessageContext mc = wsContext.getMessageContext(); 
    mc.get(BindingProvider.USERNAME_PROPERTY); 
    mc.get(BindingProvider.PASSWORD_PROPERTY); 
} 

Ma ho sempre trovato nulla, io didn 't istituito nulla in xml, web service funziona bene, tranne che non posso ottenere quelle variabili :(

sto correndo sia su Java 1.6, Tomcat 6 e JAX-WS.

Qualsiasi aiuto con l'autenticazione degli utenti con password da un database è molto apprezzato, Grazie.

+0

Ho anche provato il controllo di BindingProvider.USERNAME_PROPERTY in un SOAPHandler, ancora nulla. – ahoge

risposta

12

BindingProvider.USERNAME_PROPERTY e BindingProvider.PASSWORD_PROPERTY corrispondono al meccanismo di autenticazione di base HTTP che abilita il processo di autenticazione a livello HTTP e non a livello di applicazione o servlet.

Fondamentalmente, solo il server HTTP conoscerà il nome utente e la password (e infine l'applicazione in base alle specifiche del server HTTP/dell'applicazione, come Apache/PHP). Con Tomcat/Java, aggiungere una configurazione di accesso BASIC nel proprio web.xml e appropriati vincoli di sicurezza/ruoli di sicurezza (ruoli che verranno successivamente associati a utenti/gruppi di utenti reali).

<login-config> 
    <auth-method>BASIC</auth-method> 
    <realm-name>YourRealm</realm-name> 
</login-config> 

Quindi, collegare il dominio a livello del server HTTP (o del server applicazioni) con il repository utente appropriato. Per Tomcat puoi guardare JAASRealm, JDBCRealm o DataSourceRealm che potrebbero soddisfare le tue esigenze.

http://tomcat.apache.org/tomcat-6.0-doc/realm-howto.html

19

Penso che si sta cercando per l'autenticazione JAX-WS a livello di applicazione, non HTTP di base nel livello di server. Vedere il seguente esempio completo:

Application Authentication with JAX-WS

Sul sito client di servizi Web, basta mettere il vostro “username” e “password” in intestazione di richiesta.

Map<String, Object> req_ctx = ((BindingProvider)port).getRequestContext(); 
req_ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, WS_URL); 

Map<String, List<String>> headers = new HashMap<String, List<String>>(); 
headers.put("Username", Collections.singletonList("someUser")); 
headers.put("Password", Collections.singletonList("somePass")); 
req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS, headers); 

Sul sito del server del servizio Web, ottenere i parametri dell'intestazione della richiesta tramite WebServiceContext.

@Resource 
WebServiceContext wsctx; 

@WebMethod 
public String method() { 
    MessageContext mctx = wsctx.getMessageContext(); 

    Map http_headers = (Map) mctx.get(MessageContext.HTTP_REQUEST_HEADERS); 
    List userList = (List) http_headers.get("Username"); 
    List passList = (List) http_headers.get("Password"); 
    //... 
+0

Posso chiedere da dove hai ricevuto tali informazioni? Ho bisogno della fonte ufficiale di informazioni, ma non ho trovato nessuna fonte ufficiale con sufficienti informazioni! –

+3

L'esempio qui riportato è molto mal progettato e molto insicuro. Non dovresti mai cucinare a casa una soluzione di sicurezza. L'esempio trasferisce anche nomi utente e password su http non sicuri. Se qualcuno sta ascoltando la rete è facile da imparare. È anche molto semplice configurare l'autenticazione di base (vedere la risposta del fiocco di neve) e usarla su https. Questa è almeno una soluzione decente che non richiede una programmazione soggetta a errori - e le password sono sicure su reti non protette. –

1

Per un esempio utilizzando sia, l'autenticazione a livello di applicazione e l'autenticazione di base HTTP vedere uno del mio previous posts.

1

Mi trovavo di fronte a una situazione simile, ho bisogno di fornire al mio WS: nome utente, password e tipo di password WSS.

Inizialmente usavo "Http Basic Auth" (come @ahoge), ho provato a usare il ref @ Philipp-Dev. pure. Non ho avuto una soluzione di successo.

Dopo un po 'profonda ricerca di Google, ho trovato questo post:

https://stackoverflow.com/a/3117841/1223901

e c'era la mia soluzione problema

Spero che questo può aiutare a chiunque altro, come aiuta a me.

Rgds, iVieL