Я хотел бы комбинировать функцию DeclarativeLinking от Джерси с его функцией RolesAllowed.Адресационные ссылки на объявление с использованием RolesAllowed
Я могу успешно вставлять ссылки в ответ, но эта инъекция не обращает внимания на аннотацию RolesAllowed этой конечной точки.
В качестве примера представьте двух пользователей. Назовите их администратором и пользователем. Оба могут получить доступ к ресурсам GET, но только администратор может получить доступ к DELETE.
Если метод ресурса защищен @RolesAllowed, то я ожидаю, что пользователь, который не имеет этой роли, не будет иметь эту конечную точку. Это, похоже, не так.
Я следовал примеру here.
Ниже приведена упрощенная версия проекта, над которым я работаю для иллюстративных целей.
Для администратора Я хотел бы ожидать следующий JSON,
{
"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"
},
},
}
Это именно то, что я получаю. К сожалению, я также получаю этот ответ для пользователя, у которого нет правильных ролей, необходимых для доступа к этой конечной точке. Пользователь по-прежнему будет снабжен ссылкой на конечной точке удаления, но из-за RolesAllowed, что пользователь получит 403.
Модель
public class Model {
private int id;
private String value;
//constructor/getters/setters
представление модели
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
Модельный ресурс
@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);
}
Вопрос Есть ли способ, которым условная декларативная связь может быть достигнута на основе RolesAllowed?
Я знаю, что существует условие условия для аннотации InjectLink, но допустимыми для этого значениями являются экземпляр (ModelRep), сущность (объект ответа, я думаю?), Ресурс (ModelResource).
Я не знаю, как использовать любой из них для проверки разрешений.
Значительно признателен за любые советы