2017-10-26 17 views
1

권한 평가를위한 사용자 정의 클래스를 작성하려고하므로 스프링 보안 @PreAuthorize 및 스프링 표현 언어 (예 : this) (authority)와 함께 사용할 수 있습니다. 이 방법은 문자열 타입의 가변 인자를 취 같이Spring spEL에 varargs를 전달하면 "메소드를 com.sun.proxy에서 찾을 수 없습니다."

boolean anyOfRoles(String... roles) 

다음과 같은

@PreAuthorize("@permissionEvaluator.anyOfRoles(@authority.ADMIN)") 

PermissionEvaluator#anyOfRoles 방법 선언 같습니다 어떤 역할 이름과 단지 일반 봄 구성 요소)입니다. 위의 예제에서와 같이 하나의 매개 변수 만 전달되었지만 둘 이상의 인수 (예 :

@PreAuthorize("@permissionEvaluator.anyOfRoles(@authority.ADMIN, @authority.USER)") 

org.springframework.expression.spel.SpelEvaluationException: EL1004E: Method call: Method anyOfRoles(java.lang.String,java.lang.String) cannot be found on com.sun.proxy.$Proxy132 type 

가 발생되도록합니다. (단지 문법 설탕입니다 변수 인수로 기본적으로 동일) 문자열의 배열로 호출 할 때 여전히 다음과 같이 작동합니다

@PreAuthorize("@permissionEvaluator.anyOfRoles(new String[] { @authority.ADMIN, @authority.USER })") 

난 단지 enigmatically SPEL하지만 봄 설명서와 함께 가변 인자 전달에 대한 몇 가지 추가 정보를 찾기 위해 노력 spEL 설명서의 mentions

Varargs도 지원됩니다.

이 예외의 원인이 될 수 있으며 spEL에서 배열을 전달하는 것 이외의 다른 해결 방법이 있습니까?

답변

0

어떤 스프링 버전을 사용하고 있습니까? 난 그냥 4.3.12로이 테스트 케이스를 실행하며 ... 괜찮 았는데

@SpringBootApplication 
public class So46953884Application { 

    public static void main(String[] args) { 
     SpringApplication.run(So46953884Application.class, args); 
    } 

    @Value("#{foo.foo('a', 'b')}") 
    private String foo; 

    @Bean 
    public ApplicationRunner runner() { 
     return args -> System.out.println(foo); 
    } 

    @Bean 
    public Foo foo() { 
     return new Foo(); 
    } 

    public static class Foo { 

     public String foo(String... strings) { 
      return "filled: " + Arrays.toString(strings); 
     } 

    } 

} 

결과 :

filled: [a, b] 
+0

나는 그것이 봄 부팅과 함께 제공되는 버전이기 때문에 (봄 4.3.12를 실행하는거야 1.5.8 내가 사용하고 있습니다). 그냥 변수 값을 가져 오는 문제가 아닌지 확인하기 위해 (다른 구성 요소에서 변수 값을 가져 오는 중입니다) spEL에서 문자열을 리터럴로 전달하려고했지만 동일한 예외가 발생했습니다. – Plebejusz

+0

흥미 롭; 보안 정보를 가지고 재현 할 수 있습니다 ... 조사 중 ... –

+1

문제의 빈이 프록시 인 경우 문제가됩니다. 이 [SPR-16122] (https://jira.spring.io/browse/SPR-16122) JIRA 문제를 열었습니다. –