2011-12-29 18 views
2

我知道這個錯誤的原因(可能是這是配置問題,或者更現實的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) 
... 

這樣做的原因是:

  1. /登入網址是受保護的,所以DefaultFilterChainValidator.checkLoginPageIsntProt ected ()失敗,並且
  2. AffirmativeBased.decide()試圖拋出異常:

    ... 
    if (deny > 0) { 
    throw new AccessDeniedException(messages.getMessage("AbstractAccessDecisionManager.accessDenied", 
    "Access is denied")); 
    } 
    ... 
    
  3. 這裏提取信息,並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。 Spring Security MessageSource

+0

可能這是因爲問題。 請參閱https://jira.springsource.org/browse/SEC-1885(我有自定義身份驗證管理器實例的問題,得到默認構造函數NotFoundException,並且此問題是此問題的根源)。 – akazlou 2012-01-05 16:12:04

回答

1

Spring Framework和Spring Security之間存在衝突,儘管在單獨的發佈計劃中,它們恰好碰巧具有相同的版本。 Spring Security依賴於Spring Framework 3.0.6,而Maven在排除這些較舊的依賴關係方面做得並不好。

Spring框架的文物需要從Spring Security的依賴被明確排除如下:

<dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-core</artifactId> 
     <version>3.1.0.RELEASE</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-expression</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-context</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-web</artifactId> 
     <version>3.1.0.RELEASE</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-expression</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-context</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-config</artifactId> 
     <version>3.1.0.RELEASE</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-context</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

http://raibledesigns.com/rd/entry/upgrading_appfuse_to_spring_security

0

,如果你有ApplicationContext聲明的類路徑的錯誤也可能出現此錯誤:

private ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 
                      ^^ 
相關問題