2010-05-25 2 views
6

EL (표현식 언어) 기능을 사용하여 내 애플리케이션에 Spring Security 주석을 사용할 것을 고려하고 있습니다. 예 :EL을 사용하는 스프링 보안 주석 - 컴파일 된 디버그 정보가 필요합니까?

@PreAuthorize("hasPermission(#contact, 'admin')") 
public void deletePermission(Contact contact, Sid recipient, Permission permission); 

고유 한 ACL 구현을 구축했기 때문에 EL 기능이 필요합니다. 그러나, "#contact"형의 인수를 가지는이 기능을 사용하려면 스프링 문서이 말한다 :

당신은 표현으로 이름으로 변수를하는 방법의 인수에 액세스 할 수 있습니다, 여러분의 코드가 디버그 정보가 제공 컴파일

이 두 가지 질문 구걸 :.

  1. 그것은 허용이 생산 응용 프로그램을 상업적으로 0123을 가질 수를에 디버그 정보가 배포되어 있습니까?
  2. 그렇지 않은 경우 약 주위에 어떤 방법이 있습니까?

감사합니다!

답변

9

해결 방법으로 사용자 정의 ParameterNameDiscoverer을 구현할 수 있습니다.

public class SimpleParameterNameDiscoverer implements 
     ParameterNameDiscoverer { 

    public String[] getParameterNames(Method m) { 
     return getParameterNames(m.getParameterTypes().length);   
    } 

    public String[] getParameterNames(Constructor c) { 
     return getParameterNames(c.getParameterTypes().length);   
    } 

    protected String[] getParameterNames(int length) { 
     String[] names = new String[length]; 

     for (int i = 0; i < length; i++) 
      names[i] = "arg" + i; 

     return names; 
    } 
} 

및 구성 : 여기에 간단한 번호가 이름을 생성하는 예 (arg0 등)입니다 지금은 참조를 찾을 수 없습니다

<global-method-security ...> 
    <expression-handler ref = "methodSecurityExpressionHandler" /> 
</global-method-security> 

<beans:bean id = "methodSecurityExpressionHandler" 
    class = "org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"> 
    <beans:property name = "parameterNameDiscoverer"> 
     <beans:bean class = "foo.bar.SimpleParameterNameDiscoverer" /> 
    </beans:property> 
</beans:bean> 
+0

이것은 큰 물건을 할 수 있습니다. 나는이 인터페이스에 대해 몰랐다. 이 구현을 기반으로 주석의 숫자로 인수를 참조 할 것입니다. @PreAuthorize ("hasPermission (# arg0, 'admin')") 솔직히 말해서 이것은 내 용도로는 괜찮다고 생각합니다. . 분산 된 JAR에서 디버그 정보를 가지고있는 것에 대해 어떻게 생각하세요? – HDave

+2

@HDave : 분산 된 코드에서 디버그 정보에 관해서는 아무 것도 말할 수 없습니다. 개인적으로는 컴파일러 옵션에 의존하는 코드의 동작을 만들기 때문에 디버그 정보에 의존하는 것들을 싫어합니다. – axtavt

+0

2013 년 10 월 3 일부터 스프링 세컨드 3.1에서이 방법이 가장 좋은 방법입니까? – NimChimpsky

0

,하지만 당신은 자바를 알고 관심이있을 수도 있습니다 8은 디버깅 모드에서도 Java 8에 항상 매개 변수 이름이 포함되어 있다고하더라도 항상 매개 변수 이름을 포함합니다.