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

我有一个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/

10-10 15:54