2010-05-25 46 views
6

我正在考虑对我的应用程序使用Spring Security注释,并使用EL(表达式语言)功能。例如:带EL的Spring安全注释 - 需要在?中编译调试信息?

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

我需要EL功能,因为我已经构建了自己的ACL实现。然而,使用这种能力的“#contact”类型参数,Spring文档这样说:

您可以通过名称作为表达访问任何方法 参数 变量,只要你的代码有 调试信息编译

这就带来两个问题:

  1. 这是可以接受的一个 生产应用市场 与调试信息分发?
  2. 如果不是,有没有办法围绕 这个?

感谢您的任何指导!

回答

9

作为一种解决方法,您可以使用自己的策略实施自定义ParameterNameDiscoverer。这里是一个简单的生产编号名称(arg0等)的例子:

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

及配置:

<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中,‘管理员’)”) 说实话 - 我认为这是好的,我的目的。如何在分布式JAR中使用调试信息? – HDave 2010-05-26 02:02:21

+2

@HDave:我不能说分布式代码中的调试信息,我个人不喜欢调试信息相关的东西,因为它使得代码的行为依赖于编译器选项。 – axtavt 2010-05-26 11:06:56

+0

从春季3.1,2013年10月开始,这仍然是最好的方式吗? – NimChimpsky 2013-10-01 12:19:54

0

我现在找不到了参考,但你可能有兴趣知道的Java 8将始终包含参数名称,即使我相信Java 8在任何时候都会包含参数名称,即使在调试模式下也是如此。