2013-04-14 13 views
19

Java ile HTTP BASIC Kimlik Doğrulaması kullanıyorum.HTTP temel kimlik doğrulamasından nasıl parola alınır

Benim Servlet JMS mesajı gönderir ancak bağlantı oluştururken Kendimi kimlik doğrulaması için kullanıcı ve parola sağlamanız gerekmektedir:

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

ben HttpServletRequest.getUserPrincipal gelen adlarını alabilir(). Ama şifreyi geri almanın bir yolu yok gibi görünüyor. Bunu nasıl çözebilirim?

cevap

57

Kullandığınız parola, büyük olasılıkla oturum açarken kullanıcılar tarafından sağlanandan farklıdır. Kullanım durumu sorudan net değilken, JMS Bağlantı Fabrikası'na bağlantı oluşturmak için harici kullanıcılar tarafından sağlanan kullanıcı adını/şifreyi kullanmaya çalışıyorsunuz. Bu bana mimari olarak sağlam gelmiyor. Korunması gereken ConnectionFactory'a bağlanmak için sadece bir kimlik bilgisi kullanmalısınız (db bağlantıları gibi davranın). Daha iyisi, ConnectionFactory'yi aramak ve kullanıcı adı/şifre yönetimi konularını atlamak için JNDI'yı kullanmaktır.

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

Mimarlık hakkında haklısınız. O zamandan beri yaklaşımı terk ettim ve sadece kimlik bilgilerini içermeyen javax.jms.ConnectionFactory.createConnection() yaklaşımını benimsedim. –

+1

Teşekkürler. Çalıştı ama bir çimdikle. Ancak 'Base64' statik sınıf olarak adlandırılamaz. Ben yaptım: Base64 b = yeni Base64(); \t \t \t Dize kimlik bilgileri = new Dize (b.decode (base64Credentials), Charset.forName ("UTF-8")); – iankits

+1

@iankits Java 8 semantiği biraz farklıdır. –

1
: Eğer tekniğini kullanmak zorunda durumda

Ancak, Java8 Base64 sınıfını kullanarak benim Tutulma

açık olduğu gibi kod block.I Gitblit projesinden kopyalayarak am aşağıdakileri kullanabilirsiniz

Kullanıcı adı ve parola ilk olarak HTTP Authorization başlığında (base64 kodlanmış) gönderilmiştir; Ancak kullanıcı çerezleri kullanarak bir oturumu sürdürürse, her seferinde mutlaka bu başlığı göndermez.