2015-10-09 96 views
2

前提:
Web服务通过REST公开其数据。每条记录都属于创建记录的用户(行级安全性)。用户只能检索自己的记录。Spring Data REST:一个实体的多个端点

@RepositoryRestResource(path = "talks") 
public interface TalkRepository extends PagingAndSortingRepository<Talk, Long> { 

    @Override 
    @Query("select t from Talk t where t.owner.id= ?#{principal?.id}") 
    Page<Talk> findAll(Pageable pageable); 
} 

该存储库现在可在/talks端点下使用。

问:
有没有一种方法1)在多个端点公开相同的域实体和2)定义不同@Query注释取决于终点?

  • /talks
    我想那一定是我的默认实现开放的管理角色
  • /me/talks
    这是对本金和作为/me/**端点被暴露的部分适用行级安全端点公开API来实施客户。

此问题部分与https://jira.spring.io/browse/DATAREST-555有关,但仅限于目前不支持附加路径段。

理由:
我想不必把过多的条件逻辑到规划环境地政司查询,如is owner or has_some_role(一些例子here)的想法。此外,通过与默认API不同的策略来保护/me/**端点变得容易(例如,只有/me/**可能受到OAuth2的支配)。

+1

只需编写一个控制器,将其绑定到一个URI并自己调用存储库? –

回答

2

如果你知道更好/更简洁的解决方案,我很乐意接受其他答案。

基于@OliverGierke,在official docs和其他各种SO答案(也几乎完全由奥利弗,大多123)我实现了一个定制的控制器,以服务端点的建议。

这也可以启用自定义端点上的投影,并使用Spring Data REST的HATEOS汇编器提供HAL+JSON输出。到目前为止,我没有做的工作是如何重新使用SDR提供的简档和阿尔卑斯逻辑,但它们会在自定义控制器中丢失。

@BasePathAwareController 
public class MyTalksController { 

    private final TalkRepository repository; 
    private final PagedResourcesAssembler pagedResourcesAssembler; 

    @Autowired 
    public MyTalksController(TalkRepository repo, PagedResourcesAssembler assembler) { 
     repository = repo; 
     pagedResourcesAssembler = assembler; 
    } 

    @RequestMapping(method = RequestMethod.GET, value = "/me/talks") 
    @ResponseBody 
    public PagedResources<?> getTalks(Pageable pageable, PersistentEntityResourceAssembler entityAssembler) { 
     Page<Talk> talks = repository.meFindAll(pageable); 
     return pagedResourcesAssembler.toResource(talks, entityAssembler); 
    } 
} 
+0

你知道如果不使用PagedResourceAssembler是可能的吗? –

相关问题