2016-12-07 1 views
6

Es gibt viele Möglichkeiten, eine gute Sicherheit für REST (easy) -Dienste zu erhalten. Ich habe es schon versucht. In diesem Fall ist nur eine Standardauthentifizierung erforderlich. Also nicht basierend auf Login, RequestFilters, etc. Bitte konzentrieren Sie sich auf dieses Beispiel.Umgang mit einer basic/base64-Sicherheit 401-Ausnahme in RestEasy und Tomcat

Beim Hinzufügen von Sicherheit zu einer RestEasy "Post" -Methode bekomme ich 401 Ausnahmen. Wie kann ich sicheren Zugang zum "Post" bekommen? Ich habe den Authenticator-Code von Adam Bien/Atjem König benutzt.

Ohne die Sicherheitseinstellungen in der web.xml bekomme ich normalen Zugriff, so dass ein Teil des Codes gut funktioniert. Ich brauche/brauche keinen Login-Bildschirm dazwischen.

Tomcat Benutzer: conf/tomcat-users.xml:

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

Web.xml Datei:

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

Anwendungsklasse:

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

Authenticator 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); 
     } 
    } 
} 

Ressourcen Klasse und Methode:

@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; 
    } 
} 

Client-Klasse:

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

Können Sie überprüfen, ob Sie die gleiche URL im Browser drücken, erhalten Sie einen Login-Dialog. – gladiator

+0

@Ravikant Sharma - gute Frage! Danke und Gratulation an die +50. Ich habe eine JQuery erstellt, die die Post-Abfrage durchführt ... also habe ich die grundlegende Benutzeranmeldung erhalten. Ich konnte mich nicht anmelden. Aha ... also habe ich einen Tomcat-Server aus Eclipse gestartet ... aber dieser hatte keine Benutzerdaten konfiguriert. Ich habe einen separaten Tomcat konfiguriert. SO, bitte posten Sie Ihren Kommentar als Antwort und Sie erhalten die +50! – tjm1706

+1

Pro-Tipps für die Veröffentlichung: (a) Wir verwenden hier keine [gelösten] Titeländerungen, wobei die Annahme "Tick" ausreichend ist; (b) bevorzugen wir Antworten, die unten gegeben werden, und nicht als Bearbeitungen der Frage; (c) Titel sind am besten als einfaches, fließendes Englisch, ohne '::' und '|' Trennzeichen, um selbstgemachte Tags einzuführen - verwenden Sie dafür das Tagging-System. – halfer

Antwort

1

Die angegebene Software korrekt war. Die Bereitstellung war falsch.

Das Problem beim Abrufen der 401-Ausnahme bestand darin, dass die Software auf dem mit Eclipse verbundenen privaten Tomcat-Server bereitgestellt wurde. Auf diesem Server wurde keine Konfiguration mit Benutzern vorgenommen.

Die Lösung des Problems bestand darin, die WAR-Datei auf den separaten Tomcat-Server zu exportieren. Auf diesem Tomcat-Server habe ich die Benutzer über die tomcat-users-Konfigurationsdatei konfiguriert.