>

내 구성에 인터셉터가 있으며 다른 사용자의 리소스에 대한 액세스를 금지하고 싶습니다. WebMvcConfig (WebMvcConfigurer 구현) 내부에는 다음이 있습니다.

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new FolderInterceptor(userService, folderService))
            .addPathPatterns(Mapping.FOLDER_MAPPING + "/{id}",
                    Mapping.UPDATE_FOLDER_MAPPING + "/{id}",
                    Mapping.DELETE_FOLDER_MAPPING + "/{id}",
                    Mapping.DOWNLOAD_FOLDER_MAPPING + "/{id}");
}

FolderInterceptor에는 액세스 폴더를 가져 와서 소유자를 확인하는 preHandle 메소드가 있습니다 :

Map pathVariables = (Map) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
Long id = Long.valueOf((String) pathVariables.get("id"));
User user = userService.getLoggedAccount();
if (folderService.existsById(id)) {
    Folder folder = folderService.findById(id);
    if (folder.getOwner().getId().equals(user.getId())) {
        return true;
    }
    else {
        response.sendError(403, "Unauthorized");
        return false;
    }
}
else {
    response.sendError(404, "Folder does not exist");
    return false;
}

폴더 개체를 인쇄하면 해당 줄에 동일한 오류가 발생합니다.

org.hibernate.LazyInitializationException: could not initialize proxy.

도움을 주셔서 감사합니다.


  • 답변 # 1

    Folder 를 검색 중입니다  하나의 트랜잭션에서 종속성을 가져 오지 않는 엔티티는 다음과 같습니다.

    Folder folder = folderService.findById(id);
    
    

    그런 다음 folder.getOwner() 에 액세스하려고 할 때 소유자 종속성을 가져 오지 않고 지속성 제공자가 데이터베이스에서 지연로드를 시도합니다.

    if (folder.getOwner().getId().equals(user.getId())) {
        return true;
    }
    
    

    문제는 그 folder 입니다  거래 범위를 벗어 났으며 분리 된 엔티티입니다.

    Owner 를 가져 오는 것이 좋습니다    folderService.findById(id) 내부  메소드를 사용하거나 쿼리와 조건부를 동일한 트랜잭션 방식으로 설정하십시오.

  • 답변 # 2

    getOne 메소드를 사용하여 서비스에서 ID별로 폴더를 검색했습니다. 이제 folderRepository.findById (id)를 사용하면 다음과 같이 작동합니다.

    public Folder findById(Long id) {
        Optional<Folder> folder = folderRepository.findById(id);
        if (!folder.isPresent())
            return null;
        return folder.get();
    }
    
    

  • 이전 django - 모델 'A'를 모델 'B'의 속성과 일치시키는 방법은 무엇입니까?
  • 다음 scala - Seq의 n 번째 요소를 다른 Seq 요소로 바꾸는 방법은 무엇입니까?