Spring Data Rest:返回用户资源

我正在使用Spring Boot和Spring Data Rest创建一个简单的CRUD-App(购物清单)。 我有一个资源: ShoppingItem 。 是否有一种简单的方法只返回属于发送请求的用户的资源? (多用户支持)因此,用户只能获得自己的ShoppingItems而不是每个ShoppingItem。 或者我必须自己实现一个控制器,我这样做?

我发现基于用户这种方法的Spring Data REST过滤数据可以根据用户过滤资源,但这对我的存储库端点没有帮助。

提前致谢

如果您使用的是Spring安全集成,则可以使用ACL(可能很重)或简单的postFilter ,如下所示:

 public interface ShoppingItemRepository extends CrudRepository { @PostFilter("filterObject.user.getId() == principal.id") @Override Iterable findAll(); } 

我最近解决了这个问题,请参阅Spring Data Rest Override Repositories(Controllers vs AOP)

我发现最优雅的解决方案是使用AOP,这个示例包含QueryDSL和Spring Data REST Repositories:

 @Aspect @Transactional @Component public class FilterProjectsAspect { @Pointcut("execution(* com.xxx.ProjectRepository.findAll(..))") public void projectFindAll() { } @Around("projectFindAll()") public Object filterProjectsByUser(final ProceedingJoinPoint pjp) throws Throwable { Object[] args = pjp.getArgs(); for (int i = 0; i < args.length; i++) { if (args[i] instanceof Predicate) { Predicate predicate=(Predicate) args[i]; BooleanExpression isProjectOwner =buildExpressionForUser() predicate = ExpressionUtils.allOf(isProjectOwner, predicate); args[i]=predicate; //Update args } return pjp.proceed(args); } } 

您最好实现Controller,原因如下:

  • 想象一下,你的应用程序有一些管理界面可以查看所有购物清单(像管理员帐户一样)

  • 或者您需要在某些基于cron的作业中操作购物清单(缺少用途)