2016-04-07 3 views
0

Ich möchte, dass mein Autorisierungsmechanismus Standardbenutzer zurückgibt, wenn Header für BacicAuth nicht angegeben ist. Ich habe versucht, es so zu tun:Dropwizard Auth - Wie Standardbenutzer zurückgeben, wenn Header nicht gegeben ist?

@Override 
    public Optional<User> authenticate(final BasicCredentials basicCredentials) throws AuthenticationException { 

     String email = basicCredentials.getUsername(); 
     String plaintextPassword = basicCredentials.getPassword(); 

     final Optional<User> user = Optional.of(userDao.getUserByEmail(email)); 

     if (user.isPresent()) { 
      return user; 
      } 
     else { 
      return Optional.of(defaultUser); 
     } 
    } 

Aber irgendwie habe ich noch 401 erhalten, wenn ich eine Anfrage ohne richtigen Kopf machen.

Wie kann ich es funktionieren lassen?

Antwort

2

Wenn also kein Basic Auth-Header vorhanden ist, wird eine Null BasicCredentials an einen Vorauthentifizierungsprozess übergeben, der eine automatische nicht autorisierte Fehlerreaktion auslöst. Also müssen wir sicherstellen, dass es einen Header gibt. Zu diesem Zweck können Sie einen Jersey-Filter registrieren, der vor dem Dropwizard-Authentifizierungsfilter ausgeführt wird. Dort können wir eine Kopfzeile mit Standard-Benutzernamen und Passwort hinzufügen.

import java.io.IOException; 
import javax.annotation.Priority; 
import javax.ws.rs.Priorities; 
import javax.ws.rs.container.ContainerRequestContext; 
import javax.ws.rs.container.ContainerRequestFilter; 
import javax.ws.rs.core.HttpHeaders; 
import org.glassfish.jersey.internal.util.Base64; 

@Priority(Priorities.AUTHENTICATION - 100) 
public class PreAuthenticationFilter implements ContainerRequestFilter { 

    @Override 
    public void filter(ContainerRequestContext request) throws IOException { 
     boolean hasValidHeader = false; 
     if (request.getHeaders().containsKey(HttpHeaders.AUTHORIZATION)) { 
      final String header = request.getHeaderString(HttpHeaders.AUTHORIZATION); 
      if (header.toLowerCase().startsWith("basic")) { 
       hasValidHeader = true; 
      } 
     } 
     if (!hasValidHeader) { 
      final String defaultUser = "defaultUser"; 
      final String defaultPassword = "defaultPassword"; 
      final String base64 = Base64.encodeAsString(defaultUser + ":" + defaultPassword); 
      request.getHeaders().putSingle(HttpHeaders.AUTHORIZATION, "Basic " + base64); 
     } 
    } 
} 

Dann registrieren es mit DW env.jersey().register(PreAuthenticationFilter.class);

+0

Dank! Es funktionierte perfekt – VanDavv

+0

Frage ist, wenn Sie den Filter verwenden, warum nicht Auth in diesem Filter sofort? Meiner Meinung nach ist das DW-Auth ein bisschen fehlerhaft, da es etwas Kontrolle wegnimmt, die ich für wichtig halte. Ich bevorzuge Auth in den Filter über die Verwendung von DW-Ansatz. Viele Leute haben das gleiche Problem, denke ich. – pandaadb

+0

Es gibt ein paar Filter in der authN/authZ-Kette. Zuerst ist der Authentifizierungsfilter. Dropwizard verwendet Ihren Authentifikator in diesem Filter. Der Jersey Autorisierungs (rolesallowed) Filter, der Ihren Authorizer aufruft. So unterschiedliche Filter behandeln verschiedene Dinge. Vielleicht ist das, was Sie fehlerhaft sehen, nicht der Prozess, sondern die Implementierung des Authentifizierungsfilters. Für Ihren speziellen Anwendungsfall, ja, stimme ich zu, dass es eine Last ist, diese Arbeit zu nutzen. Aber so ist es implementiert. –

Verwandte Themen