2013-04-14 95 views
19

我正在使用HTTP基本身份驗證與Java。如何從HTTP基本身份驗證獲取密碼

我的servlet發送JMS消息,但我需要提供用戶名和密碼,以驗證自己在創建連接:

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

我可以檢索HttpServletRequest.getUserPrincipal用戶名()。但似乎沒有辦法檢索密碼。我該如何解決這個問題?

回答

57

您提到的密碼與登錄時用戶提供的密碼大不相同。雖然用例不清楚,但似乎您正嘗試使用外部用戶提供的用戶名/密碼來創建到JMS Connection Factory的連接。這對我來說聽起來並不安全。您應該只使用一個憑證連接到需要保護的ConnectionFactory(將其視爲數據庫連接)。最好是使用JNDI來查找ConnectionFactory並繞過用戶名/密碼管理的東西。

但是,如果你必須使用該技術,可以使用下面的代碼block.I是從Gitblit項目複製它,因爲它是在我的日食

使用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

你是對的體系結構。我已經放棄了這種方法,並採用了無證書的javax.jms.ConnectionFactory.createConnection()方法。 –

+1

謝謝。它的工作,但有一個調整。但是你不能稱'Base64'爲靜態類。我做了: Base64 b = new Base64(); \t \t \t String credentials = new String(b.decode(base64Credentials),Charset.forName(「UTF-8」)); – iankits

+1

@iankits Java 8語義略有不同。 –

1

用戶名和密碼最初是在HTTP Authorization標題(base64編碼)中發送的,因此您可以使用它;但是如果用戶使用cookie維護會話,則他們不一定每次都會發送該頭文件。