我正在考虑使用EL(表达式语言)功能为我的应用程序使用Spring Security注释。例如:
@PreAuthorize("hasPermission(#contact, 'admin')")
public void deletePermission(Contact contact, Sid recipient, Permission permission);
我需要EL功能,因为我已经构建了自己的ACL实现。但是,要将此功能与“#contact”类型参数一起使用,Spring文档会说:
您可以访问任何方法 按名称作为表达式的参数 变量,只要你的代码有 调试编译的信息。
这引出了两个问题:
感谢您提供任何指导!
答案 0 :(得分: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>
答案 1 :(得分:2)
我想这不是第一次遇到问题时的选项,但现在你可以这样做
@PreAuthorize("hasPermission(#contact, 'admin')")
public void deletePermission(@P("contact") Contact contact, Sid recipient, Permission permission);
答案 2 :(得分:1)
我现在找不到引用,但您可能有兴趣知道Java 8将始终包含参数名称,即使我相信Java 8将始终包含参数名称,即使在调试模式下也是如此。 / p>