如何保护关联资源?

时间:2016-10-10 10:11:33

标签: spring-security spring-data-rest

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

我有一个类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以同样的方式定义一些条件。因此,只有在经过身份验证的用户是资源的所有者时才允许访问,这是我的真正目标。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

一种选择是在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 /关联实体

答案 1 :(得分:0)

将摘录投影应用于关联实体的存储库,并按照

中的说明添加安全检查

Spring Data Rest: Security based projection

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