【问题标题】:Spring Boot REST: Filter results depending on user roleSpring Boot REST:根据用户角色过滤结果
【发布时间】:2019-03-17 12:24:10
【问题描述】:

我正在构建一个带有身份验证和不同角色的 rest 后端。现在的问题是,我喜欢根据用户角色过滤结果。

我自己没有实现控制器,而是使用 PagingAndSortingRepository Inferface,这工作得很好。我正在寻找类似于python-django method 的东西。

解决方案必须符合 REST 模式。

为了更清楚,这里有一个示例

假设我有两个用户,用户 A 是角色“user”的普通用户。用户 B 是具有“admin”角色的管理员。

有一个数据库表,其中存储了userData。该表如下所示。

| ID | username | name | email |

他们都向/userData发送了一个简单的认证GET请求。

现在我的后端根据authentication 标头检测用户并添加角色。

现在根据角色,用户 A 应该只得到一个包含他的个人数据的答案,用户 B 应该得到所有可以通过 /userData 访问的数据。

用户 A 的响应:

{
   "res":[
      {
         "id":1,
         "username":"userA",
         "name":"A",
         "email":"userA@mail.com"
      }
   ]
}

用户 B 的响应:

{
   "res":[
      {
         "id":1,
         "username":"userA",
         "name":"A",
         "email":"userA@mail.com"
      },
      {
         "id":2,
         "username":"userB",
         "name":"B",
         "email":"userB@mail.com"
      },
      {
         "id":3,
         "username":"userC",
         "name":"C",
         "email":"userC@mail.com"
      }
   ]
}

【问题讨论】:

  • 那么控制器查询一个查询数据的服务?然后您将身份验证传递给该服务?
  • 不,我没有控制器。 GETPOST等的方法是由spring boot在运行时创建的,通过PagingAndSortingRepository Inferface
  • 正如您在可能的副本中看到的那样,拥有两个单独的端点并使用 @PreAuthorize 注释保护它们要容易得多。
  • 确实如此,但这不符合其余模式。我认为这将是一个非常肮脏的解决方案。尤其是因为我必须保护大量这样的端点。

标签: java spring rest spring-boot


【解决方案1】:

我为 Spring-Data-Jpa 创建了一个扩展,它可以处理这些类型的需求(+ 更多)。 spring-data-jpa-acl

您可以使用一些简单的注释按角色或关联设置规则,所有 data-jpa 方法和 REST 端点都将受到这些规则的影响。 该扩展为 JPA 查询添加了额外的规范,因此所有过滤都将在数据库端进行,因此您甚至可以对过滤后的数据使用分页。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多