2013-04-14 10 views
19

Sto utilizzando l'autenticazione HTTP BASIC con Java.Come ottenere la password dall'autenticazione di base HTTP

mia Servlet invia un messaggio JMS, ma ho bisogno di fornire l'utente e password per l'autenticazione me stesso durante la creazione del collegamento:

javax.jms.ConnectionFactory.createConnection(String username, String password) 

posso recuperare il nome utente da HttpServletRequest.getUserPrincipal(). Ma sembra che non ci sia modo di recuperare la password. Come lo risolvo?

risposta

57

La password a cui si fa riferimento è probabilmente diversa da quella fornita dagli utenti durante il login. Mentre il caso d'uso non è chiaro dalla domanda, ma sembra che tu stia cercando di usare il nome utente/password fornito da utenti esterni per creare una connessione a JMS Connection Factory. Questo non mi sembra architettonicamente sicuro. È necessario utilizzare una sola credenziale per connettersi a ConnectionFactory che deve essere protetto (trattarlo come le connessioni db). Meglio usare JNDI per cercare ConnectionFactory e bypassare il nome utente/password.

Tuttavia, nel caso in cui si deve usare la tecnica, può utilizzare i seguenti codici block.I sono la copia dal progetto Gitblit come è stato aperto nel mio Eclipse

Utilizzando classe Java8 Base64:

final String authorization = httpRequest.getHeader("Authorization"); 
    if (authorization != null && authorization.startsWith("Basic")) { 
     // Authorization: Basic base64credentials 
     String base64Credentials = authorization.substring("Basic".length()).trim(); 
     String credentials = new String(Base64.getDecoder().decode(base64Credentials), 
       Charset.forName("UTF-8")); 
     // credentials = username:password 
     final String[] values = credentials.split(":",2); 
+0

Hai ragione riguardo all'architettura. Da allora ho abbandonato l'approccio e ho appena adottato l'approccio javax.jms.ConnectionFactory.createConnection() senza credenziali. –

+1

Grazie. Ha funzionato, ma con un ritocco. Ma non puoi chiamare Base64 come classe statica. Ho fatto: Base64 b = new Base64(); \t \t \t Credenziali stringa = nuova stringa (b.decode (base64Credentials), Charset.forName ("UTF-8")); – iankits

+1

@iankits Java 8 semantics è leggermente diverso. –

1

Il nome utente e la password sono stati originariamente inviati nell'intestazione HTTP Authorization (codificata Base64), quindi è possibile utilizzarla; ma se l'utente mantiene una sessione utilizzando i cookie, non invierà necessariamente quell'intestazione ogni volta.

Problemi correlati