2013-04-14 6 views
19

Ich benutze die HTTP BASIC Authentifizierung mit Java.Wie bekomme ich ein Passwort von der HTTP-Basisauthentifizierung?

Mein Servlet sendet eine JMS-Nachricht, aber ich brauche den Benutzer und Kennwort angeben, mich zu authentifizieren, während die Verbindung zu erstellen:

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

ich die Benutzername aus HttpServletRequest.getUserPrincipal abrufen kann(). Aber es scheint keine Möglichkeit zu geben, das Passwort abzurufen. Wie löse ich das?

Antwort

57

Das Passwort, auf das Sie sich beziehen, unterscheidet sich höchstwahrscheinlich von dem, das Benutzer beim Anmelden angegeben haben. Der Anwendungsfall ist aus der Frage nicht eindeutig, aber anscheinend versuchen Sie, den Benutzernamen/das Kennwort externer Benutzer zu verwenden, um eine Verbindung zu JMS Connection Factory herzustellen. Das klingt für mich architektonisch nicht sicher. Sie sollten nur eine Berechtigung für die Verbindung mit ConnectionFactory verwenden, die geschützt werden muss (behandeln Sie sie wie db-Verbindungen). Besser ist es, JNDI zu verwenden, um ConnectionFactory zu suchen und die Benutzer-/Passwortverwaltung zu umgehen.

jedoch, falls Sie die Technik verwenden können, verwenden Sie Code Baustein.Anschluss folgende kopiere es aus Gitblit Projekt, wie es in meiner Finsternis

Mit Java8 Base64-Klasse offen war:

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

Sie haben Recht mit der Architektur. Ich habe seitdem den Ansatz aufgegeben und nur den Anmeldungs-freien javax.jms.ConnectionFactory.createConnection() -Ansatz übernommen. –

+1

Danke. Es hat funktioniert, aber mit einem Tweak. Aber Sie können 'Base64' nicht als statische Klasse aufrufen. Ich habe: Base64 b = neue Base64(); \t \t \t Zeichenfolge Anmeldeinformationen = neue Zeichenfolge (b.decode (Base64Credentials), Charset.forName ("UTF-8")); – iankits

+1

@iankits Java 8 Semantik ist etwas anders. –

1

Der Benutzername und das Passwort wurden ursprünglich im HTTP-Header Authorization (base64-codiert) gesendet. Wenn der Benutzer jedoch eine Sitzung unter Verwendung von Cookies führt, sendet er diesen Header nicht unbedingt jedes Mal.

Verwandte Themen