2013-09-23 79 views
2

(很抱歉,如果这是一个重复的,但问题是很对搜索引擎不友好。)如何在Spring EL评估春EL

我想知道如何评价春天EL里面EL(与所有的函数,变量,上下文等通过)。

具体来说,我想动态评估一个弹簧安全表达式(它只是EL加上一些函数和上下文),从硬编码的EL中的数据库实体加载到@PreAuthorize中。

即类似@PreAuthorize("eval(argument.securityExpr)")

回答

2

您可以扩展Springs MethodSecurityExpressionRoot(并在您自己的MethodSecurityExpressionHandler中创建它)并添加一个eval方法,该方法除了一个String并让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函数在每种方法中都可以访问安全表达式

但是:您必须是意识到描述安全规则的人员可以访问当前弹簧环境中的所有bean!可能是安全漏洞。

0

如果您使用简单的参数名称与@发现来评估权限,您可以在不启用调试模式的情况下实际执行任何操作。

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

mySecurityService可以是任何豆/方法返回一个布尔值,与此连接好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; 
     } 


    } 

和背景:

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

我不知道如果我理解正确的答案,但它似乎关注如何获得参数,而不是如何评估存储在参数中的安全表达式。我已经有权访问该参数,但我不知道如何评估安全性表达式(即您的@ @ mySecurityService.hasPermission()位)。 –

+0

只需使用@然后你想要的任何bean和方法... – NimChimpsky

+0

事情是我依靠Spring来评估表达式。我的项目中没有办法做到这一点。 –