복붙노트

[SPRING] Spring 데이터 Rest : 사용자 자원 반환

SPRING

Spring 데이터 Rest : 사용자 자원 반환

나는 Spring Boot와 Spring Data Rest와 함께 간단한 CRUD-App (쇼핑 목록)을 만들고있다. 나는 자원이있다 : ShoppingItem. 요청을 보내는 사용자에게 속한 리소스 만 반환하는 쉬운 방법이 있습니까? (다중 사용자 지원) 따라서 사용자는 모든 ShoppingItem이 아닌 자신의 ShoppingItems 만 가져옵니다. 아니면 내가 직접 컨트롤러를 구현해야합니까?

사용자를 기반으로 리소스를 필터링하기 위해이 접근 방식을 기반으로 데이터를 필터링하는 Spring Data REST를 발견했으나 저장소 엔드 포인트에 도움이되지 않습니다.

미리 감사드립니다.

해결법

  1. ==============================

    1.Spring 보안 통합을 사용한다면 다음과 같이 ACL (무겁거나) 또는 간단한 postFilter를 사용할 수 있습니다 :

    Spring 보안 통합을 사용한다면 다음과 같이 ACL (무겁거나) 또는 간단한 postFilter를 사용할 수 있습니다 :

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

    2.나는 최근에이 문제를 해결했다. Spring 데이터 Rest Override Repositories (컨트롤러 대 AOP)

    나는 최근에이 문제를 해결했다. Spring 데이터 Rest Override Repositories (컨트롤러 대 AOP)

    내가 찾은 가장 우아한 해결책은 QueryDSL과 Spring Data REST Repository를 가지고 AOP를 사용하는 것이다.

    @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. ==============================

    3.몇 가지 이유로 컨트롤러를 구현하는 것이 좋습니다.

    몇 가지 이유로 컨트롤러를 구현하는 것이 좋습니다.

  4. from https://stackoverflow.com/questions/30834138/spring-data-rest-return-resources-of-user by cc-by-sa and MIT license