在Spring Data REST上对Spring Security进行更精细的控制

时间:2019-01-25 19:29:24

标签: spring spring-boot spring-data-rest

我在 Spring Security 中有多个密切相关的问题。我正在使用Spring Boot进行开发,并且正在使用 Spring Data REST 直接从我的存储库创建REST端点。

我有多个实体,要求将所有这些实体作为REST端点。我让spring-data-rest处理这些端点的创建,并通过在需要的地方向实体存储库方法添加@PreAuthorize@PostAuthorize来保护这些端点。当我呼叫/entity/id之类的端点时,此方法非常有用。

但我现在面临的问题。假设我有两个实体,Entity1Entity2,并且它们之间具有One to One的关系。 Spring Data Rest使我可以像Entity2一样从Entity1提取相关的/entity1/id/entity2数据。但是我对Entity1Entity2具有不同的访问权限,并且调用上述端点仅检查存储库中为Entity1设置的访问权限。因此,如果用户有权访问Entity1表而不能访问Entity2表,则他仍可以通过Entity2的外键关系看到一些Entity1数据。这是正确的设计吗?

此外,我们有一些自定义API端点,其中我们必须聚合来自多个实体存储库的数据。同样,这些端点本身也必须得到保护。因此,我在端点方法上使用了@PreAuthorize。这可以按预期工作,并且仅在表达式有效时才调用端点方法。但是,当调用存储库方法(当然是通过服务类)时,也会评估该存储库方法上的@PreAuthorize。我想一开始就做检查。有可能这样做吗?

欢迎提出任何改进设计的建议。

1 个答案:

答案 0 :(得分:1)

没有大规模修改/覆盖许多默认Spring DataRest功能的简单解决方案。我已经使用了这么多年的软件包,并且对我来说效果很好。 尽管切换到此软件包对您来说可能有点过大,但从长远来看,这可能会带来麻烦,因为它还解决了仅在数月后才会遇到的许多问题。

  • 您可以直接在域对象中通过注释设置权限规则。
  • 它检查数据库侧的权限,因此大大减少了API和数据库之间的流量(仅从当前用户有权访问的数据库中提取这些对象)
  • 您可以分别为角色和/或某些用户设置READ / UPDATE / DELETE / CREATE权限
  • 您可以对权限过滤的集合使用分页
  • 您也可以在属性集合上使用分页

(+一些附加功能,例如对多个属性的灵活搜索)

here is the package(这是Spring Data JPA / Data Rest的扩展)