可以通过以下示例定义问题:
我有一个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();
}
}
公共访问:
/实体
/ entities / entityId
管理员权限:
/ entities / entityId /关联实体
关于spring-security - 如何保护关联资源?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57482085/