JAX-RS和资源所有权限制

时间:2015-11-13 11:01:22

标签: java web-services rest jax-rs

有很多关于如何设置JAX-RS API的优秀资源和文献。但是,我还没有找到任何正确描述如何对特定资源和方法进行安全限制的资源。例如,给定资源PictureResource,只有图片的上传者(和管理员)应该能够删除或更改与图片相关的属性,而任何人都应该能够查看图片。管理员限制很好,因为它可以由roles解决,但上传器将取决于调用的上下文。然后,标识用户的令牌将描述谁正在进行呼叫。这可以通过ContainerRequestFilter来解决。

@Path("pictures/{pictureId}")
public class PictureResource {

    @GET
    public Response getPicture(@PathParam("pictureId") final int pictureId) {
        // Get the picture, available for all users.
    }

    @DELETE
    public Response deletePicture(@PathParam("pictureId") final int pictureId) {
        // Delete the picture, only available for the uploader of the picture and admins.
    }

    // ...
}

JAX-RS解决此问题的方法是什么?我假设这可以通过注释来解决,但对我来说如何做到这一点却相当含糊。另一种方法是根据呼叫的上下文动态地为用户分配pictureOwnerRole吗?

1 个答案:

答案 0 :(得分:2)

问题是离散资源访问控制。您需要一种标准方法来描述所有权方面的访问资源。谁拥有该资源,谁被授予了它的范围权限。

问题是这是特定于域的。资源分组和所有权要求能够查找资源实例或关联的元数据并确定所有权/访问要求。

我不知道为此提供标准框架或注释的任何安全框架。

您可以将图片放入目录结构中,并使用目录访问控制来确定哪些用户具有对资源的访问权限。

@Secured("ownerDecider=PictureInspector.class")之类的东西就是我接近它的方式。然后,Spring安全性中的AccessDecisionVoterAfterInvocationProvider可以使用提供的策略来识别所有权,并相应地限制访问。