Spring security 如何保护关联资源?

Spring security 如何保护关联资源?,spring-security,spring-data-rest,Spring Security,Spring Data Rest,问题可通过以下示例定义: 我有一个类main class,它通过@OneToOne关系与另一个名为AssociatedClass的类相关联。两者都有一个公开的存储库,因此我可以在URL/mainClasses/{some_id}和URL/associatedClasses/{some_id}上进行访问。但是,AssociatedClassRepository具有以下代码: @RepositoryRestResource public interface AssociatedClassReposi

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

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

@RepositoryRestResource
public interface AssociatedClassRepository extends PagingAndSortingRepository<AssociatedClass, String> {
    @Override
    @PreAuthorize("1 == 2")
    AssociatedClass findOne(String s);
}
@RepositoryRestResource
公共接口AssociatedClassRepository扩展了分页和排序存储库{
@凌驾
@预授权(“1==2”)
关联类findOne(字符串s);
}
因此,它永远不会将GET方法授权给类型为
AssociatedClass
的对象。但是,由于类型为
MainClass
的对象有一个关联的
AssociatedClass
对象,我可以通过在
/MainClass/{some_id}/AssociatedClass
上执行GET来获取此对象

我想阻止对
/mainclass/{some_id}/associatedClass
的访问,但不是对所有用户。我想用我可以通过
@predition
完成的方法定义一些条件。因此,只有当经过身份验证的用户是资源的所有者时,我才能允许访问,这是我真正的目标


有什么想法吗?

一个选项是在URL级别保护Spring数据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();
            }
        }
公众访问:

  • /实体
  • /实体/实体ID
管理员访问:

  • /实体/实体ID/关联实体

将摘录投影应用于关联实体的存储库,并在其中添加安全检查,如中所述


关联的资源将被返回,但您可以隐藏某些字段或所有字段。

您可以发布控制器代码吗?存储库代码呢?我没有任何控制器,因为我使用的是SpringDataREST。我编辑了这篇文章,这样你就可以看到AssociatedClassRepository的完整代码了。在我看来,安全性根本没有被激活。SpringDataREST基本上只是调用该方法。如果这没有触发安全异常,那么您的Spring安全设置似乎不正确。您确定已激活方法安全性吗?如果我对URL执行GET
/associatedClasses/{some_id}
,则响应将始终为
403禁止
。因此,
@PreAuthorize
工作正常。这将适用于大多数情况。不幸的是,在我的情况下,我需要根据登录用户是否是资源的所有者来保护资源。例如,在我的用户类中,我用
@PreAuthorize(“principal.id==#id”)
注释了
findOne
方法。我还有另一个类(“CreatedEntity”),它与作为每个对象的所有者/创建者的用户相关。因此,问题将出现在URL
/createdEntities/id/createdBy
上。