Я до сих пор не понимаю, почему вам пришлось реализовать собственный обработчик доступа ... В настоящее время я столкнулся с той же задачей:
<security:access-denied-handler error-page="/accessDenied"/> - works like charm.
Не забудьте указать обработчик в вашем контроллере:
@RequestMapping(value = "/accessDenied")
public String accessDenied() {
return "accessDenied"; // logical view name
}
Обновление для Spring Boot (октябрь 2014 г.):
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.exceptionHandling().accessDeniedHandler(customHandler) OR .accessDeniedPage("/somePage.html").and
.formLogin()
.failureHandler(ajaxAuthenticationFailureHandler)}
В настоящее время мы на самом деле не возвращаем представления для такой задачи, так как запускается angular js, так что вы можете использовать свой обработчик неудачи / успеха и возвращать адаптированные ответы JSON. Для нас было достаточно использовать обработчик сбоев, но вы можете выбрать, где вы хотите, чтобы ваш элемент управления активировался. Обычно мы не используем средства разрешения представления, поскольку существуют фреймворки тайлов UI (такие как угловые партиалы), способные создавать части на одной странице. для тебя. Части HTML хранятся на сервере и служат просто статическими ресурсами.
Давайте поиграем с Embedded Tomcat, чтобы добиться поведения, аналогичного web.xml!
@Configuration
@EnableAutoConfiguration
public class ApplicationWebXml extends SpringBootServletInitializer {
private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.profiles(addDefaultProfile())
.showBanner(false)
.sources(Application.class);
}
//required for container customizer to work, the numerous tutorials didn't work for me, so I simply tried overriding the default one
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
return tomcat;
}
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer(
) {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
TomcatEmbeddedServletContainerFactory containerFactory = (TomcatEmbeddedServletContainerFactory) container;
containerFactory.setSessionTimeout(1); // just for your interest, remove as necessary
containerFactory.addErrorPages(new ErrorPage(HttpStatus.FORBIDDEN,"/views/accessDenied.html"),
new ErrorPage(HttpStatus.NOT_FOUND,"/views/notFound.html"));
containerFactory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
connector.setPort(8082);// just for your interest, remove as necessary
}
});
}
};
}
}