我知道這個錯誤的原因(可能是這是配置問題,或者更現實的springframework/spring安全問題),但是我不'不知道如何解決它。Spring Security:MessageSource未初始化 - 在通過上下文訪問消息之前調用'refresh'
這裏是堆棧跟蹤(僅限事業類都包含):
...
at org.springframework.context.support.AbstractApplic ationContext.getMessageSource(AbstractApplicationC ontext.java:1224)
at org.springframework.context.support.AbstractApplic ationContext.getMessage(AbstractApplicationContext .java:1206)
at org.springframework.context.support.MessageSourceA ccessor.getMessage(MessageSourceAccessor.java:83)
at org.springframework.security.access.vote.Affirmati veBased.decide(AffirmativeBased.java:83)
at org.springframework.security.config.http.DefaultFi lterChainValidator.checkLoginPageIsntProtected(DefaultFilterChainValidator.java:170)
at org.springframework.security.config.http.DefaultFi lterChainValidator.validate(DefaultFilterChainValidator.java:35)
at org.springframework.security.web.FilterChainProxy. afterPropertiesSet(FilterChainProxy.java:148)
...
這樣做的原因是:
- /登入網址是受保護的,所以DefaultFilterChainValidator.checkLoginPageIsntProt ected ()失敗,並且
AffirmativeBased.decide()試圖拋出異常:
... if (deny > 0) { throw new AccessDeniedException(messages.getMessage("AbstractAccessDecisionManager.accessDenied", "Access is denied")); } ...
這裏提取信息,並SpringSecurityMessageSource類用於此目的:
public class SpringSecurityMessageSource extends ResourceBundleMessageSource { public SpringSecurityMessageSource() { setBasename("org.springframework.security.messages "); } public static MessageSourceAccessor getAccessor() { return new MessageSourceAccessor(new SpringSecurityMessageSource()); } }
而實際上,如果AbstractAccessDecisionManager沒有實施MessageSourceAware一切都沒有問題,因爲(見附件截屏)由不明原因XmlWebApplicationContext試圖重寫有效的初始化MessageSourceAccessor(再次參見截圖)(是的,XmlWebApplicationContext實際上實現了MessageSource),但是這種行爲很奇怪(或者我錯過了什麼?)。
而且,當然,在此初始化之後,messageSource爲空,並且無法檢索到所需的消息。
這個特定的問題可以通過提供訪問(permitAll)給/ signin(真正必須要做的)來解決,但這不是這種情況,這種情況是如何解決這個問題的,如果發生錯誤,我可以看到詳細的消息,並且org.springframework.security.message將被使用並且不被覆蓋。
最後一個註釋,< debug/>被使用,只是如果你有興趣。我使用spring security 3.1.0.RELEASE和spring framework 3.1.0.RELEASE。
可能這是因爲 問題。 請參閱https://jira.springsource.org/browse/SEC-1885(我有自定義身份驗證管理器實例的問題,得到默認構造函數NotFoundException,並且此 問題是此問題的根源)。 –
akazlou
2012-01-05 16:12:04