首页 文章

Spring Data Rest:返回用户资源

提问于
浏览
1

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

我找到了Spring Data REST filtering data based on the user这种基于用户过滤资源的方法,但这对我的存储库 endpoints 没有帮助 .

提前致谢

3 回答

  • 1

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

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

    我最近解决了这个问题,请参阅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);
        }
    
    }
    
  • 3

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

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

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

相关问题