2013-03-25 49 views
6

Bir dizi kaynağı saran ve bunları temel HTTP yetkisi ile korumak için gereken bir sunucu uygulaması yazmak istiyorum; Gönderilen kullanıcı adı/şifre, dosyaya sunulmadan önce arka uç veritabanına göre kontrol edilir.Bir sunucuda HTTP Temel Kimlik Doğrulaması Uygulaması

Bunun için çalışan herhangi bir örneği var mı? http://www.coderanch.com/t/352345/Servlets/java/HTTP-basic-authentication-Web-Applications numaralı telefonu denedim ancak IllegalStateException numarasına sendError numaralı çağrıya geri dönmeye devam etti.

+0

Post servlet –

+0

Sadece linkte örnek kullandı: Burada

JMock kullanarak sınıf için temel bir birim test vardır. –

+1

@Roy, postanızdaki örnek benim için iyi çalıştı. Senin için neden hata verdiğini bilmiyorum. Mesajınızı stacktrace ile günceller misiniz? –

cevap

17

Bir Kimlik Bilgisi nesnesini (bakla nesnesi oturum açma ve parola) döndüren bazı kodlar. ? & =/é $ £:

public Credentials credentialsWithBasicAuthentication(HttpServletRequest req) { 
    String authHeader = req.getHeader("Authorization"); 
    if (authHeader != null) { 
     StringTokenizer st = new StringTokenizer(authHeader); 
     if (st.hasMoreTokens()) { 
      String basic = st.nextToken(); 

      if (basic.equalsIgnoreCase("Basic")) { 
       try { 
        String credentials = new String(Base64.decodeBase64(st.nextToken()), "UTF-8"); 
        LOG.debug("Credentials: " + credentials); 
        int p = credentials.indexOf(":"); 
        if (p != -1) { 
         String login = credentials.substring(0, p).trim(); 
         String password = credentials.substring(p + 1).trim(); 

         return new Credentials(login, password); 
        } else { 
         LOG.error("Invalid authentication token"); 
        } 
       } catch (UnsupportedEncodingException e) { 
        LOG.warn("Couldn't retrieve authentication", e); 
       } 
      } 
     } 
    } 

    return null; 
} 

Hatta olarak korkak olarak bir şifre ile, iyi çalışıyor.

public void testCredentialsWithBasicAuthentication() { 
    // Setup 
    final HttpServletRequest request = context.mock(HttpServletRequest.class); 

    AuthentificationHelper helper = new AuthentificationHelper(); 
    String login = "mickael"; 
    String password = ":&=/?é$£"; 
    String base64Hash = Base64.encodeString(login + ":" + password); 
    final String authHeader = "Basic " + base64Hash; 

    // Expectations 
    context.checking(new Expectations() { 
     { 
      oneOf (request).getHeader("Authorization"); 
      will(returnValue(authHeader)); 
     } 
    }); 

    // Execute 
    Credentials credentials = helper.credentialsWithBasicAuthentication(request); 

    // Verify 
    assertNotNull(credentials); 
    assertEquals(login, credentials.getLogin()); 
    assertEquals(password, credentials.getPassword()); 

    context.assertIsSatisfied(); 
} 
+1

Resmi Java belgelerinden alınan "StringTokenizer" sınıfının kullanımı hakkında küçük bir not: "StringTokenizer", kullanımının yeni kodda kaldırılmasına rağmen uyumluluk nedenleriyle saklanan eski bir sınıftır. Bu işlevselliği isteyen herkesin tavsiye edilmesi önerilir. '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – xonya

+0

Base64 sınıfı nereden geliyor? –

+0

Java ile bir süredir kodlanmadım ama J2SE'nin Base64 kısmı değil miyim? https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html adresinde olduğu gibi –

İlgili konular