可以通过以下示例定义问题:

我有一个MainClass类,它通过AssociatedClass关系与另一个名为@OneToOne的类相关。两者都有一个公开的存储库,因此我可以对URL /mainClasses/{some_id}和URL /associatedClasses/{some_id}进行GET。但是,AssociatedClassRepository具有以下代码:

@RepositoryRestResource
public interface AssociatedClassRepository extends PagingAndSortingRepository<AssociatedClass, String> {
    @Override
    @PreAuthorize("1 == 2")
    AssociatedClass findOne(String s);
}

因此,它将永远不会将GET方法授权给AssociatedClass类型的对象。但是,由于MainClass类型的对象具有关联的AssociatedClass对象,因此我可以通过在/mainClasses/{some_id}/associatedClass上执行GET来获取此对象。

我想阻止对/mainClasses/{some_id}/associatedClass的访问,但不禁止所有用户访问。我想通过@PreCondition来定义某些条件。这样,只有在经过身份验证的用户是资源所有者的情况下,我才可以允许访问,这是我的真正目标。

有任何想法吗?

最佳答案

一种选择是在URL级别保护Spring Data REST端点。例如:

        @Override
        public void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
           .antMatchers("/entity/{[0-9]+}/{[A-Za-z][A-Za-z0-9]+}").hasRole("ADMIN").
           and().csrf().disable();
            }
        }

公共(public)访问:
  • /实体
  • /entities/entityId

  • 管理员权限:
  • /entities/entityId/相关实体
  • 关于spring-security - 如何保护关联资源?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39955961/

    10-09 09:51