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 序列化 (you can use it on other side)
的当前行为
如果您正在使用 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);
}
}
我正在创建一个简单的 CRUD 应用程序(购物清单),其中包含 Spring 引导和 Spring 数据休息。我有一个资源:ShoppingItem
。有没有一种简单的方法可以只 return 属于发送请求的用户的资源? (多用户支持)所以一个用户只能得到他自己的 ShoppingItems 而不是每个 ShoppingItem。
或者我必须自己实现一个控制器,我在哪里做?
我发现 Spring Data REST filtering data based on the user 这种基于用户过滤资源的方法,但这对存储库端点没有帮助。
提前致谢
出于以下几个原因,您最好实现一个控制器:
假设您的应用程序具有某种管理界面来查看所有购物清单(类似于管理员帐户)
或者您需要在一些基于 cron 的工作中操作购物清单(其中缺少用途)
代码中的业务规则更适合学习新项目(即并非所有初级程序员都能轻松应对 spring 魔法)
需要注意的缺点:
- 您将不得不模仿 spring 序列化 (you can use it on other side) 的当前行为
如果您正在使用 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);
}
}