2013-09-23 3 views
2

(죄송이 중복이지만, 문제는 매우 검색 엔진 친화적이지. 경우) 내가 함께 (EL 내부에 스프링 EL을 평가하는 방법을 알고 싶어요봄 EL에 봄 EL을 평가하는 방법

모든 함수, 변수, 문맥 등)을 전달합니다.

특히, 하드 코드 된 EL 안에 @PreAuthorize의 데이터베이스 엔티티에서로드 된 스프링 보안 표현식 (일부 EL 및 일부 기능 및 컨텍스트)을 동적으로 평가하고자합니다.

e.e. @PreAuthorize("eval(argument.securityExpr)")과 같은 것입니다.

답변

2

스프링 MethodSecurityExpressionRoot를 확장하고 (자신의 MethodSecurityExpressionHandler에서 생성) String을 제외한 eval 메소드를 추가하고 SpringExpressionParser가 String을 평가하도록 할 수 있습니다. ... 일을해야

편집 :

약간의 코드 :

public class MySpringSecurityRoot extends MethodSecurityExpressionRoot { 
    private MyMethodSecurityExpressionHandler handler; // to be injected in the handler 

    public boolean eval(String expression) { 
    Expression expression = handler.getExpressionParser().parseExpression(expression); 
    return ExpressionUtils.evaluateAsBoolean(
     handler.getExpressionParser().parseExpression(expression), 
     handler.createEvaluationContext(authentification, methodInvocation)); 
    } 
} 
핸들러는 기본 방법 보안 발현 핸들러로 설정해야합니다

:

<security:global-method-security pre-post-annotations="enabled"> 
    <security:expression-handler ref="myHandler"/> 
    </security:global-method-security> 

지금 eval 함수 모든 메서드 보안 표현식에서 액세스 할 수 있습니다.

하지만 반드시 있어야합니다. 보안 규칙을 설명하는 사람이 현재 봄 컨텍스트 내의 모든 빈을 액세스 할 수 있다는 사실을 알고 있어야합니다. 보안 유출 일 수도 있습니다.

0

사용 권한을 평가하기 위해 @이라는 simpleparametername을 사용하는 경우 디버그 모드를 설정하지 않고 원하는 모든 것을 실제로 할 수 있습니다.

<bean id="methodSecurityExpressionHandler" 
      class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"> 
     <property name="parameterNameDiscoverer"> 
      <bean class="your.path.SimpleParameterNameDiscoverer"/> 
     </property> 
+0

내가 제대로 대답을 이해하면 나는 확실하지 않다 :이 ARG1

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; } } 

및 컨텍스트를 위해 유선으로

@PreAuthorize("@mySecurityService.hasPermission(#arg0)") public String getSpecial(final String special) { return "authorized"; } 

mySecurityService은 부울을 반환하는 모든 콩/방법이 될 수 있습니다 그러나 인수에 저장된 보안 표현식을 평가하는 방법과 달리 인수를 얻는 방법에 초점을 맞추는 것 같습니다. 이미 인수에 액세스 할 수 있지만 보안 표현식 (즉, @ mySecurityService.hasPermission() 비트)을 평가하는 방법을 모르겠습니다. –

+0

그냥 @ 다음 원하는 콩 및 메서드를 사용하십시오 ... – NimChimpsky

+0

것은 내가 표현을 평가하기 위해 봄에 의존하고 있습니다. 나는 그것을하기위한 나의 방법이 없다. –