Я знаю причину этой ошибки (возможно, это проблема конфигурации или более реалистичная проблема безопасности 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)
...
Причина этого заключается в следующем:
- / URL-адрес входа защищен, поэтому DefaultFilterChainValidator.checkLoginPageIsntProt ected () завершился ошибкой, и
AffirrativeBased.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 имеет значение null, и требуемое сообщение не может быть получено.
Эта конкретная проблема может быть исправлена путем предоставления доступа (allowAll) к / signin (что действительно должно быть сделано), но это не тот случай, дело в том, как это исправить, чтобы в случае ошибки, которую я мог видеть подробное сообщение и org.springframework.security.message будут использованы и не будут переопределены.
И последнее замечание: используется, просто если вам интересно. Я использую Spring Security 3.1.0.RELEASE и Spring Framework 3.1.0.RELEASE.