2016-12-07 65 views
6

REST (kolay) servisler için iyi bir güvenlik sağlamanın birçok yolu vardır. Zaten denedim. Bu durumda sadece gerekli bir Temel Kimlik Doğrulamasıdır. Yani, giriş, RequestFilters, vb dayalı değil. Lütfen bu örnek üzerinde durun.Temel/base64 güvenliği 409 İstisnası RestEasy ve Tomcat'de işleme

Bir RestEasy 'post' yöntemine güvenlik eklerken, 401 istisnası almaya devam ediyorum. 'Posta'ya' nasıl güvenli erişim sağlayabilirim? Adam Bien/Atjem König'in Authenticator kodunu kullandım.

Web.xml'deki güvenlik ayarları olmadan normal erişim elde ediyorum, böylece kodun bir kısmı düzgün çalışıyor. Aralarında herhangi bir giriş ekranına ihtiyacım yok/istiyorum.

Tomcat kullanıcıları: conf/tomcat-users.xml:

<user username="wineuser" password="winepass" roles="winer"/> 

Web.xml dosyası:

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>wine secret</web-resource-name> 
     <url-pattern>/rest/wines/secret</url-pattern> 
     <http-method>POST</http-method> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>winer</role-name> 
    </auth-constraint> 
</security-constraint> 
<login-config> 
    <auth-method>BASIC</auth-method> 
</login-config> 
<security-role> 
    <role-name>winer</role-name> 
</security-role> 

Uygulama sınıfı:

@ApplicationPath("/rest") 
public class RestEasyWineServices extends Application { 
} 

Şifrematik utils:

import java.io.IOException; 
import java.io.UnsupportedEncodingException; 
import javax.ws.rs.client.ClientRequestContext; 
import javax.ws.rs.client.ClientRequestFilter; 
import javax.ws.rs.core.MultivaluedMap; 
import javax.xml.bind.DatatypeConverter; 

public class Authenticator implements ClientRequestFilter { 
    private final String user; 
    private final String password; 
    public Authenticator(String user, String password) { 
     this.user = user; 
     this.password = password; 
    } 
    public void filter(ClientRequestContext requestContext) throws IOException { 
     MultivaluedMap<String, Object> headers = requestContext.getHeaders(); 
     final String basicAuthentication = getBasicAuthentication(); 
     headers.add("Authorization", basicAuthentication); 
    } 
    private String getBasicAuthentication() { 
     String token = this.user + ":" + this.password; 
     try { 
      return "Basic " + 
       DatatypeConverter.printBase64Binary(token.getBytes("UTF-8")); 
     } catch (UnsupportedEncodingException ex) { 
      throw new IllegalStateException("Cannot encode with UTF-8", ex); 
     } 
    } 
} 

Kaynak sınıf ve yöntemi:

@Path("/wines") 
public class WineResource { 
    ... 
    @POST @Path("secret") 
    @Produces({ MediaType.APPLICATION_JSON }) 
    @Consumes({ MediaType.APPLICATION_JSON}) 
    public Wine echoPostWineSecret(Wine inputWine2) { 
     System.out.println("Server: **SECRET** post (" + inputWine2 + ")"); 
     inputWine2 = dao.create(inputWine2); 
     return inputWine2; 
    } 
} 

Müşteri sınıfı:

Client clientSecret = ClientBuilder.newClient().register(new Authenticator("wineuser", "winepass")); 
WebTarget targetSecret = clientSecret.target("http://localhost:8080").path("/RestRestEasyJquerySqlite2Hibernate/rest/wines"); 

wine.setId(1231); 
wine.setName("secret wine name_" + dateKey); 
wine.setCountry("secret wine country_" + dateKey); 
wine.setGrapes("secret wine grapes_" + dateKey); 
wine.setRegion("secret wine region_" + dateKey); 
try { 
    wine = targetSecret.path("secret").request(MediaType.APPLICATION_JSON_TYPE).post(Entity.entity(wine, MediaType.APPLICATION_JSON_TYPE), Wine.class); 
    System.out.println("SECRET created wine: " + wine); 
} catch(Exception e) { 
    System.out.println("ERROR: Back on the client: exception"); 
    e.printStackTrace(); 
} 
+1

Tarayıcıda aynı URL’ye basıp vurmadığınızı kontrol edebilirsiniz. – gladiator

+0

@Ravikant Sharma - iyi soru! +50 ile teşekkür ederim ve tebrik ederim. Post sorguyu gerçekleştiren bir JQuery yaptım ... bu yüzden temel kullanıcı girişi var. Giriş yapamadım. Aha ... bu yüzden Eclipse'den bir tomcat sunucusuna başladım ... ama bu kullanıcının yapılandırılmış bir kullanıcı verisi yoktu. Ayrı bir Tomcat'i yapılandırdım. SO, lütfen yorumunuzu yanıt olarak gönderin, +50'yi elde edersiniz! – tjm1706

+1

İlanı göndermek için bazı ipuçları: (a) burada [çözüldü] başlık düzeltmelerini kullanmayın, kabulü kullanarak 'onay' yeterlidir; (b) aşağıda verilecek cevapları tercih etmekteyiz; (c) başlıklar en iyisi düz, akıcı İngilizce, '' '' '' '' '' 'ayırıcı aygıtları ev yapımı etiketler ile tanıtmadan - etiketleme sistemini kullanmak. – halfer

cevap

1

alıntı yazılım doğruydu. Dağıtım yanlıştı.

401 istisnası alma sorunu, yazılımın Eclipse bağlantılı özel Tomcat sunucusuna dağıtılmış olmasıydı. Bu sunucuda kullanıcılarla herhangi bir yapılandırma yapılmadı.

Sorunun çözümü, WAR dosyasını ayrı bir Tomcat sunucusuna vermek oldu. Bu Tomcat sunucusunda, kullanıcıları tomcat kullanıcıları yapılandırma dosyasıyla yapılandırdım.