我在 Spring Security 中有多个密切相关的问题。我正在使用Spring Boot进行开发,并且正在使用 Spring Data REST 直接从我的存储库创建REST端点。
我有多个实体,要求将所有这些实体作为REST端点。我让spring-data-rest
处理这些端点的创建,并通过在需要的地方向实体存储库方法添加@PreAuthorize
和@PostAuthorize
来保护这些端点。当我呼叫/entity/id
之类的端点时,此方法非常有用。
但我现在面临的问题。假设我有两个实体,Entity1
和Entity2
,并且它们之间具有One to One
的关系。 Spring Data Rest使我可以像Entity2
一样从Entity1
提取相关的/entity1/id/entity2
数据。但是我对Entity1
和Entity2
具有不同的访问权限,并且调用上述端点仅检查存储库中为Entity1
设置的访问权限。因此,如果用户有权访问Entity1
表而不能访问Entity2
表,则他仍可以通过Entity2
的外键关系看到一些Entity1
数据。这是正确的设计吗?
此外,我们有一些自定义API端点,其中我们必须聚合来自多个实体存储库的数据。同样,这些端点本身也必须得到保护。因此,我在端点方法上使用了@PreAuthorize
。这可以按预期工作,并且仅在表达式有效时才调用端点方法。但是,当调用存储库方法(当然是通过服务类)时,也会评估该存储库方法上的@PreAuthorize
。我想一开始就做检查。有可能这样做吗?
欢迎提出任何改进设计的建议。
答案 0 :(得分:1)
没有大规模修改/覆盖许多默认Spring DataRest功能的简单解决方案。我已经使用了这么多年的软件包,并且对我来说效果很好。 尽管切换到此软件包对您来说可能有点过大,但从长远来看,这可能会带来麻烦,因为它还解决了仅在数月后才会遇到的许多问题。
(+一些附加功能,例如对多个属性的灵活搜索)
here is the package(这是Spring Data JPA / Data Rest的扩展)