如何基于调用者实现REST服务的字段级访问控制?

uda*_*nga 6 java rest

我要求调用者限制REST响应中的属性.考虑JSON格式的响应.

例如:对于给定的REST端点,默认响应如下

 {
    "id" : "111"
    "name" : "John"
    "age" : "30"
 }
Run Code Online (Sandbox Code Playgroud)

对于"来电者1",响应应该是这样的

 {
    "id" : "111"
    "name" : "John"
    "age" : "null"
 }
Run Code Online (Sandbox Code Playgroud)

对于"来电者2",响应应该是这样的

{
    "id" : "111"
    "name" : "null"
    "age" : "30"
}
Run Code Online (Sandbox Code Playgroud)

在上面的响应JSON中,"null"表示这样的属性不会暴露给这样的调用者.

我正在寻找一种实现控制REST响应的方法.

Yor*_*ram 5

服务器端的实现很大程度上依赖于底层服务器技术堆栈(REST API,DB,用户角色层等).在某些配置中,您在REST层中定义数据授权,而在REST层中定义其他数据授权.实现字段级授权是一个棘手的问题,因为并非所有框架都提供此粒度.

一个提供这种粒度的框架Jello Framework(我是作者).Jello的主要功能之一是其内联授权模型,您可以在任何分辨率(命名空间,实体,字段,操作)为数据元素分配不同的访问级别,并指定谁有权通过REST API访问数据.

例如 - 假设您希望仅将"年龄"字段公开给记录所有者和站点管理员.在Jello中,它看起来像这样:

public class Person extends JelloEntity {
   @Expose @KeyElement 
   Integer  id;

   @Expose 
   String name;

   @Expose({Role.OWNER, Role.ADMIN}) 
   Integer age;
}
Run Code Online (Sandbox Code Playgroud)


Bhu*_*ale 1

我过去也有类似的要求,其中权限在字段级别是细粒度的。

我为每个实体实现了 Rest 响应编写器。我传递调用用户有权访问的该实体的字段列表。在响应编写器中,我使用该列表仅输出用户有权访问的那些字段。

我曾经从实体输出地图/列表结构。Jackson 然后将结构编组为 JSON。