Spring Security: MessageSource не инициализирован - вызовите «refresh» перед доступом к сообщениям через контекст - PullRequest
2 голосов
/ 29 декабря 2011

Я знаю причину этой ошибки (возможно, это проблема конфигурации или более реалистичная проблема безопасности springframework / spring), но я не знаю, как ее исправить.

Вот трассировка стека (включены только классы причины):

...
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. / URL-адрес входа защищен, поэтому DefaultFilterChainValidator.checkLoginPageIsntProt ected () завершился ошибкой, и
  2. AffirrativeBased.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 имеет значение null, и требуемое сообщение не может быть получено.

Эта конкретная проблема может быть исправлена ​​путем предоставления доступа (allowAll) к / signin (что действительно должно быть сделано), но это не тот случай, дело в том, как это исправить, чтобы в случае ошибки, которую я мог видеть подробное сообщение и org.springframework.security.message будут использованы и не будут переопределены.

И последнее замечание: используется, просто если вам интересно. Я использую Spring Security 3.1.0.RELEASE и Spring Framework 3.1.0.RELEASE. Spring Security MessageSource

Ответы [ 2 ]

1 голос
/ 13 марта 2012

Существует конфликт между Spring Framework и Spring Security, которые, хотя и в отдельных расписаниях выпусков, в настоящее время имеют одну и ту же версию. Spring Security зависит от Spring Framework 3.0.6, и Maven не очень хорошо исключает эти старые зависимости.

Артефакты Spring Framework необходимо явно исключить из зависимостей 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 голосов
/ 24 января 2018

Эта ошибка также может возникать, если у вас есть ошибка в пути к классам ApplicationContext объявление:

private ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
                                                                            ^ ^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...