Custom @RolesAllowed Rollen in Jersey WebService mit ContainerRequestFilter
Erstellte ich einen filter mit ContainerRequestFilter-Schnittstelle und versuchen, zuweisen von benutzerdefinierten Rollen Sie, dass die Rückgabe Entität "Benutzer".
@Override
public ContainerRequest filter(ContainerRequest request) {
User user = authenticate(request);
if (user != null) {
request.setSecurityContext(new Authorizer(user));
} else {
throw new WebApplicationException(400);
}
return request;
}
private User authenticate(ContainerRequest request) {
user = new User("erhan", "customRole");
return user;
}
public class Authorizer implements SecurityContext {
private User user;
private Principal principal;
public Authorizer(final User user) {
this.user = user;
this.principal = new Principal() {
public String getName() {
return user.username;
}
};
}
public Principal getUserPrincipal() {
return this.principal;
}
public boolean isUserInRole(String role) {
return (role.equals(user.role));
}
public boolean isSecure() {
return "https".equals(uriInfo.getRequestUri().getScheme());
}
public String getAuthenticationScheme() {
return SecurityContext.BASIC_AUTH;
}
}
public class User {
public String username;
public String role;
public User(String username, String role) {
this.username = username;
this.role = role;
}
}
Alles in Ordnung ist mit dem filter, aber wenn es geht, um web-service -
@GET
@RolesAllowed({"customRole"})
@Path("/test")
public String getByType(@Context HttpHeaders headers,@Context SecurityContext sc,
@Context HttpServletRequest request) {
return null;
}
erreicht die webservice-aber wenn ich Rolle,erreichte aber immer noch den gleichen webservice. Wie kann ich verschiedene benutzerdefinierte Rollen in Jersey ?
- Ok, ich denke ich habe die Lösung gefunden, sollte aber anders fügen Sie einfach " <init-param> <param-name>com.Sonne.jersey.spi.container.ResourceFilters</param-name> <param-value>com.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory</param-value> </init-param> filter für mein web.xml problem gelöst. Aber Warum brauche ich, um zu initialisieren, ein weiteres filter-sonst ContainerRequestFilters ?
- Da Jersey nicht support @RolesAllowed aus der box. Erwähnt filter fügt diese Unterstützung. Und BTW, sollten Sie nicht zurückkehren 400 für unbefugte, es heißt bad-request. Siehe HTTP-status 401.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit Jersey 2 Sie können einfach registrieren
RolesAllowedDynamicFeature
und sichern Sie sich Ihre Anwendung inweb.xml
. Dann brauchen Sie auch nicht customSecurityContext
Umsetzung.Sehen Jersey-custom SecurityContext auf EJB jax-rs-Ressource für details.
Versuche ein Kommentar zu der Klasse.
Für mich hinzufügen @PreMatching mit @Provider funktioniert.
Es scheint, dass die Anbieter annotation ist zwingend in diesem Fall.
Wenn dies nicht funktioniert, versuchen Sie Folgendes hinzufügen:
@Priority(Prioritäten.AUTHORIZATION)
Zusätzlich müssen Sie können Rollen und registrieren RolesAllowedDynamicFeature oder verwenden Sie alternativen - check Beispiel 19.2