Ich möchte Jersey DeclarativeLinking Feature mit seiner Funktion RolesAllowed kombinieren.Trusted deklarative Verknüpfung Berechtigungen mit RolesAllowed
Ich bin in der Lage, Links erfolgreich in eine Antwort zu injizieren, aber diese Injektion beachtet die RolesAllowed-Annotation dieses Endpunkts nicht.
Stellen Sie sich als Beispiel zwei Benutzer vor. Nennen Sie sie Admin und Benutzer. Beide können auf GET-Ressourcen zugreifen, aber nur Administratoren können auf DELETE zugreifen.
Wenn eine Ressourcenmethode durch @RolesAllowed geschützt ist, würde ich erwarten, dass ein Benutzer, der diese Rolle nicht hat, diesen Endpunkt nicht injiziert bekommt. Das scheint nicht der Fall zu sein.
Ich habe das Beispiel gefunden gefunden here.
Im Folgenden finden Sie eine vereinfachte Version des Projekts, an dem ich zur Veranschaulichung arbeite.
Für Admin würde ich folgende json erwarten,
{
"id" : 1
"value" : "someValue",
"links" : [
{
"href": "http://localhost/context/model/1",
"rel": "self",
"type": "GET"
},
{
"href": "http://localhost/context/model/1",
"rel": "delete",
"type": "DELETE"
},
},
}
Das ist genau das, was ich bekommen. Leider bekomme ich diese Antwort auch für Benutzer, die nicht die richtigen Rollen haben, um auf diesen Endpunkt zuzugreifen. Der Benutzer wird nach wie vor mit einem Link zu dem Lösch Endpunkt zur Verfügung gestellt werden, aber aufgrund RolesAllowed, dass Benutzer erhalten ein 403.
Modell
public class Model {
private int id;
private String value;
//constructor/getters/setters
Modell Darstellung
public class ModelRep {
@XmlPath(".") //Allows me to flatten json so that links and document are at the same level
private Model model;
@InjectLinks({
@InjectLink(
rel = "self",
type = "GET",
resource = ModelResource.class,
method = "getModel",
bindings = @Binding(name = "id", value = "${instance.id}"),
style = Style.ABSOLUTE
),
@InjectLink(
rel = "delete",
type = "DELETE",
resource = ModelResource.class,
method = "deleteModel",
bindings = @Binding(name = "id", value = "${instance.id}"),
style = Style.ABSOLUTE
)
})
@XmlJavaTypeAdapter(LinkAdapter.class)
private List<Link> links;
//constructor/getters/setters
Modellressource
@Path("/model")
@Produces(MediaType.APPLICATION_JSON)
public class ModelResource {
@GET
@Path("/{id}")
public Response getModel(@PathParam("id") int id) {
Model m = dao.get(id);
ModelRep mr = new modelRep(m);
GenericEntity<ModelRep> ent = new GenericEntity<ModelRep>(mr) {};
return Response.status(Status.OK).entity(ent);
}
@DELETE
@Path("/{id}")
@RolesAllowed(Roles.ADMIN)
public Response deleteModel(@PathParam("id") int id) {
dao.delete(id);
return Response.status(Status.NO_CONTENT);
}
Frage Gibt es eine Möglichkeit, dass bedingte deklarative Verknüpfung basierend auf RolesAllowed erreicht werden kann?
Ich weiß, dass eine Bedingungsklausel für die Annotation InjectLink existiert, aber die zulässigen Werte sind Instanz (ModelRep), Entity (Response-Objekt, denke ich?), Ressource (ModelResource).
Mir ist keine Möglichkeit bekannt, eine dieser Methoden zu verwenden, um nach Berechtigungen zu suchen.
schätzen irgendwelche Ratschläge