Java Spring表达式语言和Spring安全性3:在@PreAuthorize中访问bean引用

Java Spring表达式语言和Spring安全性3:在@PreAuthorize中访问bean引用,java,spring,spring-security,Java,Spring,Spring Security,我试图访问@PreAuthorize注释中的bean引用,如下所示: @PreAuthorize("@testBean.getTestValue()") public String testSpEL() { .... } @Component(value="testBean") public class TestBean { public boolean getTestValue() { return true; } } 我有一个测试bean,配置如下

我试图访问@PreAuthorize注释中的bean引用,如下所示:

@PreAuthorize("@testBean.getTestValue()")
public String testSpEL() {
    ....
}
@Component(value="testBean")
public class TestBean {
    public boolean getTestValue() {
        return true;
    }
}
我有一个测试bean,配置如下:

@PreAuthorize("@testBean.getTestValue()")
public String testSpEL() {
    ....
}
@Component(value="testBean")
public class TestBean {
    public boolean getTestValue() {
        return true;
    }
}
但是,当我尝试访问testSpEL()方法时,遇到以下异常:

Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1057E:(pos 1): No bean resolver registered in the context to resolve access to bean 'testBean'
    at org.springframework.expression.spel.ast.BeanReference.getValueInternal(BeanReference.java:45)
    at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:52)
    at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:102)
    at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:97)
    at org.springframework.security.access.expression.ExpressionUtils.evaluateAsBoolean(ExpressionUtils.java:11)
我已经彻底完成了我的研究,但我找不到任何地方我需要改变我的配置,以使这项工作。有什么建议吗

谢谢

你好,乔克

另外,我正在使用Spring 3.0.5。以下内容似乎表明这种类型的功能应该有效:


我在SpringSource上发布了一个类似的问题,事实证明上述功能在SpringSecurity3.0.5中还不受支持。幸运的是,版本3.1.0.RC1确实支持它,但使用非标准SpEL语法:

@PreAuthorize("testBean.getTestValue()")
public String testSpEL() {
    ....
}
以下是SpringSource论坛上的线程url:

希望这对别人有帮助

在Spring Security 3.1中(从3.1.RC2开始)

不起作用-相反,你必须写作

@PreAuthorize("@testBean.getTestValue()")

请参见

对于那些坚持使用Spring Security 3.0.x的人,我有一个简单的解决方法。在application-securityContext.xml(或其他任何内容)中添加此类:

它将BeanFactoryResolver注入到Spring安全代码中,这是Spring Security 3.1.x修复程序的全部功能。3.0.x中已经提供了对语法的支持。它允许您使用3.1.x中的语法,ala:


@PreAuthorize(@controller.theProperty”)

我在@PreAuthorize中从未见过类似的东西:
@testBean.getTestValue()
。你能给这个特性的一个例子或文档附加一个带有URL的注释吗?看这里:在Spring安全文档中的6.5.12 Bean引用中,它说它允许SpEL,因此类似的东西应该是可能的。你曾经在@Value中尝试过同样的表达式吗annotation@Ralph:好问题!我已经重写了我的测试用例,以便:@Value(“#{@testBean.getTestValue()}”)私有字符串testValue=“foo”;其中testBean.getTestValue()返回“bar”。实际上,Spring将testValue的值更改为“bar”。所以我想这证明了语法“#{@testBean.getTestValue()}”是正确的,但它不能与Spring安全性结合使用。(很抱歉格式化,不知道如何正确格式化这些注释)在我的情况下,设置
ApplicationContext
解决了这个问题。请看Rob的回答:我还写了一篇关于这个主题的博文,以防你想了解更多:很好的博文。根据链接论坛线程的第2页,它们现在看起来是标准语法。如果有人感兴趣,博客帖子被移到这里: