Spring 数据剩余:Return 用户资源

Spring Data Rest: Return Resources of User

我正在创建一个简单的 CRUD 应用程序(购物清单),其中包含 Spring 引导和 Spring 数据休息。我有一个资源:ShoppingItem。有没有一种简单的方法可以只 return 属于发送请求的用户的资源? (多用户支持)所以一个用户只能得到他自己的 ShoppingItems 而不是每个 ShoppingItem。 或者我必须自己实现一个控制器,我在哪里做?

我发现 Spring Data REST filtering data based on the user 这种基于用户过滤资源的方法,但这对存储库端点没有帮助。

提前致谢

出于以下几个原因,您最好实现一个控制器:

  • 假设您的应用程序具有某种管理界面来查看所有购物清单(类似于管理员帐户)

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

  • 代码中的业务规则更适合学习新项目(即并非所有初级程序员都能轻松应对 spring 魔法)

需要注意的缺点:

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

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

我最近解决了这个问题,见

我找到的最优雅的解决方案是使用 AOP,此示例使用 QueryDSL 和 Spring 数据 REST 存储库:

@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);
    }

}