2017-11-02 2 views
0

Ich erstelle meinen ersten Restful Webservice mit Embedded Jetty mit Authentifizierung und Autorisierung und ich habe einen Filter, in den ich ein Benutzerobjekt (Employee) einfügen möchte, was ich dann kann Mit der ResteasyProviderFactory.pushContext() @Context-Annotation in einer Service-Bean abrufen, aber was immer ich versuche, das Objekt ist immer Null. Ich würde jede Art von Hilfe schätzen.REST-ful Webservice @Context Injection liefert immer Null

@PreMatching 
public class AuthenticationHandler implements ContainerRequestFilter { 


@Inject private PxCredentialService credentialService; 


@Override 
public void filter(ContainerRequestContext requestContext) throws IOException { 

    Response faultresponse = createFaultResponse(); 

    String authorization = requestContext.getHeaderString("Authorization"); 
    String[] parts = authorization.split(" "); 
    if (parts.length != 2 || !"Basic".equals(parts[0])) { 
     requestContext.abortWith(createFaultResponse()); 
     return; 
    } 

    String decodedValue = null; 
    try { 
     decodedValue = new String(Base64Utility.decode(parts[1])); 
    } catch (Base64Exception ex) { 
     requestContext.abortWith(createFaultResponse()); 
     return; 
    } 
    String[] namePassword = decodedValue.split(":"); 
    Employee emp = credentialService.getCredentialsByLoginAndPass(namePassword[0], namePassword[1], true); 
    if (emp != null) { 
    ResteasyProviderFactory.pushContext(Employee.class, emp); 
    } else { 
     throw new NullPointerException("False Login");//requestContext.abortWith(Response.status(401).build()); 
    } 

}

@Path("/people") 
public class PeopleRestService implements credentials { 
@Inject private PeopleService peopleService; 
@Inject private GenericUserRightsUtil genericUserRightsUtil; 


@Produces({ "application/json" }) 
@GET 
public Collection<Person> getPeople(@Context Employee emp) { 

    Employee emp = (Employee)crc.getProperty("Employee"); 

    return peopleService.getPeople(page, 5); 
} 

}

Antwort

0

Auf meinem Verständnis, möchten Sie eine einfache Möglichkeit, den Benutzer zu identifizieren, der die Anforderung in Ihrem Ressource-Methoden ausführt. Haben Sie schon einmal daran gedacht, eine SecurityContext mit einer Principal für die Anfrage zu setzen?

In Ihrem Filter, wenn die Anmeldeinformationen des Benutzers als gültig, gehen Sie wie folgt

final SecurityContext currentSecurityContext = requestContext.getSecurityContext(); 
requestContext.setSecurityContext(new SecurityContext() { 

    @Override 
    public Principal getUserPrincipal() { 

     return new Principal() { 

      @Override 
      public String getName() { 
       return username; 
      } 
     }; 
    } 

    @Override 
    public boolean isUserInRole(String role) { 
     return true; 
    } 

    @Override 
    public boolean isSecure() { 
     return currentSecurityContext.isSecure(); 
    } 

    @Override 
    public String getAuthenticationScheme() { 
     return "Basic"; 
    } 
}); 

Ihre Ressource Methode sein wird:

@GET 
@Path("{id}") 
@Produces(MediaType.APPLICATION_JSON) 
public Response foo(@PathParam("id") Long id, 
        @Context SecurityContext securityContext) { 
    ... 
} 

Um die Principal, zu verwenden:

Principal principal = securityContext.getUserPrincipal(); 
String username = principal.getName();