0

스프링 데이터의 this example에서 CRUD 저장소가 있습니다. 사용자 정의 권한 평가를 추가하려고하지만 PermissionEvalutor의 구현에서 targetDomainObject은 항상 null입니다. 일치하는 인터페이스와 구현 매개 변수 이름을 만드는 this question에 대한 답변의 제안에 따라 ItemRepositorytargetDomainObject는 PermissionEvaluator에서 항상 null입니다.

@PreAuthorize("hasRole('ROLE_USER')") 
public interface ItemRepository extends CrudRepository<Item, Long> { 
    @PreAuthorize("hasPermission(#entity, 'DELETE')") 
    <S extends Item> S save(S entity); 

    @PreAuthorize("hasRole('ROLE_ADMIN')") 
    void delete(Long id); 
} 

는, 나는 표현과 방법 매개 변수를 모두 item에 의해 entity을 변경 시도했습니다. 무슨 구현이 여기에 어떤 인터페이스와 일치해야하는지 모르겠다. 그래서 나는 SimpleJpaRepositoryItemRepository/CrudRepository에 대해 추측하고있다. 어쨌든, 작동하지 않습니다. targetDomainObject은 항상 null입니다. 다른 방법에서는 targetId과 동일합니다.

디버깅 MethodSecurityEvaluationContext.lookupVariableaddArgumentsAsVariables() 내부에 args.length = 0이라는 메시지를 표시 한 다음 Unable to resolve method parameter names for method: public abstract xx.xxx.Item xx.xxx.ItemRepository.save(xx.xxx.Item). Debug symbol information is required if you are using parameter names in expressions.을 기록합니다. lookupVariable에 모든 것이 null입니다.

디버그 기호가 #이 아닌가? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

참조 된 질문의 답변을 수락 할 때 뭘 찾았습니까? "'MethodSecurityEvaluationContext.lookupVariable' 메소드가 디버거와 작동하는 방법을 확인할 수도 있습니다." –

+0

@JensSchauder 디버그 정보로 편집 된 질문 – garci560

답변

1

실제 코드를 보지 않았지만 디버그 정보에 대해 작성한 것을 판단 할 때 Spring은 매개 변수 이름을 찾을 수 없습니다. 아마도 인터페이스에서 온 것이므로 바이트 코드에 포함되지 않았을 것입니다 기본적으로.

-parameters 컴파일러 플래그를 추가 해보십시오. 비슷한 질문에 대한 답변도 참조하십시오. https://stackoverflow.com/a/40787280

+0

그게 전부였습니다. 고마워, 나는 미쳐 가고 있었다. – garci560