2011-04-21 36 views
9

我想在@PreAuthorize註釋訪問bean引用如下訪問bean引用:春表達式語言和Spring安全3:在@PreAuthorize

@PreAuthorize("@testBean.getTestValue()") 
public String testSpEL() { 
    .... 
} 

我有一個測試的bean配置如下:

@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) 

我已經徹底完成了我的研究,但我無法找到任何需要在配置中進行更改才能實現此功能的地方。任何指針?

謝謝!

親切的問候,Jonck

P.S.我正在使用Spring 3.0.5。下面似乎表明這種類型的功能應該工作:

https://jira.springsource.org/browse/SPR-7173

+0

我從來沒有見過這樣的:@ testBean.getTestValue()'的'@PreAuthorize。你能否附上評論和URL的例子或這個功能的文件。 – Ralph 2011-04-21 12:48:35

+1

看看這裏: http://static.springsource.org/spring/docs/3.0.x/reference/expressions.html 在6.5.12 bean引用 在它說,它允許規劃環境地政司Spring Security的文檔,因此這樣的事情應該是可能的。 – 2011-04-21 13:22:47

+0

你有沒有在@Value註釋中試過相同的表達式 – Ralph 2011-04-21 14:21:55

回答

5

我已經發布了類似的問題在SpringSource的,事實證明,的確是上面的功能尚未在春季安全3.0.5支持。幸運的是版本3.1.0.RC1不支持它,但非標準規劃環境地政司語法:

@PreAuthorize("testBean.getTestValue()") 
public String testSpEL() { 
    .... 
} 

這裏是縫紉線的SpringSource的論壇的網址: SpringSource forum thread

希望這可以幫助別人!

+0

我也寫了一篇關於這個主題的博客文章,以防你想了解更多關於它的內容:http://blog.42.nl/articles/spring-security -accessing-spring-beans-from-your-annotations – 2011-04-29 21:03:50

+0

不錯的博客文章。看起來他們現在是基於鏈接論壇主題頁面2的標準語法。 – digitaljoel 2011-11-20 05:55:11

+0

如果有人對此感興趣,博客文章已移到此處:http://dontpanic.42.nl/2011/04/spring-security-accessing-spring-beans.html – 2016-06-01 07:50:21

0

對於任何人停留在春季安全3.0 .x我有一個簡單的解決方法。添加在您的應用程序securityContext.xml(或其他)這個類:

https://gist.github.com/3340059

它注入一個BeanFactoryResolver到Spring Security的代碼,這是所有的Spring Security 3.1.X修復了。對語法的支持已經在3.0.x中。它可以讓你使用語法從3.1.X,鼻翼:

@PreAuthorize("@controller.theProperty")