使用EL进行Spring安全注释 - 需要编译的调试信息?

HDa*_*ave 6 debugging acl spring-security

我正在考虑使用Spring安全注释为我的应用程序,使用EL(表达式语言)功能.例如:

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

我需要EL功能,因为我已经构建了自己的ACL实现.但是,要将此功能与"#contact"类型参数一起使用,Spring文档会说:

如果代码中包含编译的调试信息,则可以按名称访问任何方法参数作为表达式变量.

这引出了两个问题:

  1. 将生产应用程序商业化分发并附带调试信息是可以接受的吗?
  2. 如果没有,有什么办法吗?

感谢您的任何指导!

axt*_*avt 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

和配置:

<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>
Run Code Online (Sandbox Code Playgroud)

  • @HDave:我不能说分布式代码中的调试信息,个人而言,我不喜欢调试信息依赖的东西,因为它使代码的行为依赖于编译器选项. (2认同)

irb*_*ian 2

我想当您第一次解决这个问题时,这不是 \xc2\xb4t 的一个选项,但现在您可以这样做

\n\n
@PreAuthorize("hasPermission(#contact, \'admin\')")\npublic void deletePermission(@P("contact") Contact contact, Sid recipient, Permission permission);\n
Run Code Online (Sandbox Code Playgroud)\n\n

http://docs.spring.io/spring-security/site/docs/current/reference/html/el-access.html#access-control-using-preauthorize-and-postauthorize

\n