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
上。