【问题标题】:Spring Data Rest: Return Resources of UserSpring Data Rest:返回用户资源
【发布时间】:2015-08-30 07:08:32
【问题描述】:

我正在使用 Spring Boot 和 Spring Data Rest 创建一个简单的 CRUD-App(购物清单)。我有一个资源:ShoppingItem。有没有一种简单的方法可以只返回属于发送请求的用户的资源? (多用户支持)所以用户只能获得他自己的 ShoppingItems 而不是每个 ShoppingItem。 还是我必须自己实现一个Controller,我在哪里做?

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

提前致谢

【问题讨论】:

  • 您是否使用 spring 安全集成来处理您的用户?

标签: java spring spring-security spring-data-rest


【解决方案1】:

你最好实现一个控制器有几个原因:

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

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

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

需要注意的缺点:

【讨论】:

  • 看看 kakawait 建议的 postFilter。这应该使这一切成为可能。
  • 评论了他的回答
【解决方案2】:

我最近解决了这个问题,见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】:

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

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

    【讨论】:

    • 您好,感谢您的建议。后过滤器之类的东西是我正在寻找的原始东西,所以我会接受这个作为答案,但是当我这样做时,不可能以管理员身份获得所有 shoppinItems,不是吗?
    • 我刚刚在 spring 文档中阅读了关于 postFilter 的内容。这应该正是我想要的。我稍后会试试这个
    • 否则,如果您使用 spring secu >= 4,您还可以访问 @query 中的主体对象。并使用 hql(或 SQL)编写您自己的请求和过滤用户
    • 用于管理问题。您只需在 postFilter 中为角色 ADMIN 添加规则,以不为其角色过滤项目
    • 缺点是过滤器将所有内容提取到内存中,然后过滤对象,这使得复杂对象的处理速度变慢。此外,您实际上是将业务逻辑嵌入到注释值字符串中。你打算如何维护它?这不会解决 cron-jobs 问题,因为 cron 作业是在没有用户的情况下运行的
    猜你喜欢
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 2017-03-18
    • 2021-05-12
    • 1970-01-01
    • 2020-01-15
    相关资源
    最近更新 更多