diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointErrorPageRegistrar.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointErrorPageRegistrar.java new file mode 100644 index 00000000000..c0866d9c0f5 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointErrorPageRegistrar.java @@ -0,0 +1,23 @@ +package com.evolveum.midpoint.web.boot; + +import org.springframework.boot.web.server.ErrorPage; +import org.springframework.boot.web.server.ErrorPageRegistrar; +import org.springframework.boot.web.server.ErrorPageRegistry; +import org.springframework.http.HttpStatus; + +import com.evolveum.midpoint.web.security.MidPointApplication; + +public class MidPointErrorPageRegistrar implements ErrorPageRegistrar { + + @Override + public void registerErrorPages(ErrorPageRegistry registry) { + + registry.addErrorPages( + new ErrorPage(HttpStatus.UNAUTHORIZED, MidPointApplication.MOUNT_UNAUTHORIZED_ERROR), + new ErrorPage(HttpStatus.FORBIDDEN, MidPointApplication.MOUNT_FORBIDEN_ERROR), + new ErrorPage(HttpStatus.NOT_FOUND, MidPointApplication.MOUNT_NOT_FOUND_ERROR), + new ErrorPage(HttpStatus.GONE, MidPointApplication.MOUNT_GONE_ERROR), + new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, MidPointApplication.MOUNT_INTERNAL_SERVER_ERROR)); + } + +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java index fddb1940419..bc83a2da1ad 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java @@ -16,13 +16,12 @@ package com.evolveum.midpoint.web.boot; -import com.evolveum.midpoint.gui.impl.util.ReportPeerQueryInterceptor; -import com.evolveum.midpoint.init.StartupConfiguration; -import com.evolveum.midpoint.model.api.authentication.NodeAuthenticationEvaluator; -import com.evolveum.midpoint.prism.schema.CatalogImpl; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.web.util.MidPointProfilingServletFilter; +import java.io.File; +import java.lang.management.ManagementFactory; +import java.time.Duration; +import java.util.EnumSet; + +import javax.servlet.DispatcherType; import org.apache.catalina.Valve; import org.apache.commons.lang.StringUtils; @@ -40,8 +39,11 @@ import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration; import org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration; import org.springframework.boot.autoconfigure.web.ServerProperties; -import org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration; -import org.springframework.boot.autoconfigure.web.servlet.*; +import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration; +import org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration; +import org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration; +import org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryCustomizer; +import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.ErrorPage; @@ -59,13 +61,16 @@ import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextListener; import org.springframework.web.filter.DelegatingFilterProxy; -import ro.isdc.wro.http.WroFilter; -import javax.servlet.DispatcherType; +import com.evolveum.midpoint.gui.impl.util.ReportPeerQueryInterceptor; +import com.evolveum.midpoint.init.StartupConfiguration; +import com.evolveum.midpoint.model.api.authentication.NodeAuthenticationEvaluator; +import com.evolveum.midpoint.prism.schema.CatalogImpl; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.web.util.MidPointProfilingServletFilter; -import java.io.File; -import java.lang.management.ManagementFactory; -import java.time.Duration; +import ro.isdc.wro.http.WroFilter; /** * Created by Viliam Repan (lazyman). @@ -173,23 +178,24 @@ private static SpringApplicationBuilder configureApplication(SpringApplicationBu } @Bean - public ServletListenerRegistrationBean requestContextListener() { - return new ServletListenerRegistrationBean(new RequestContextListener()); + public ServletListenerRegistrationBean requestContextListener() { + return new ServletListenerRegistrationBean<>(new RequestContextListener()); } @Bean - public FilterRegistrationBean midPointProfilingServletFilter() { - FilterRegistrationBean registration = new FilterRegistrationBean(); + public FilterRegistrationBean midPointProfilingServletFilter() { + FilterRegistrationBean registration = new FilterRegistrationBean<>(); registration.setFilter(new MidPointProfilingServletFilter()); + registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class)); registration.addUrlPatterns("/*"); return registration; } @Bean - public FilterRegistrationBean wicket() { - FilterRegistrationBean registration = new FilterRegistrationBean(); + public FilterRegistrationBean wicket() { + FilterRegistrationBean registration = new FilterRegistrationBean<>(); registration.setFilter(new WicketFilter()); - registration.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ERROR); + registration.setDispatcherTypes(DispatcherType.ERROR, DispatcherType.REQUEST, DispatcherType.FORWARD); registration.addUrlPatterns("/*"); registration.addInitParameter(WicketFilter.FILTER_MAPPING_PARAM, "/*"); registration.addInitParameter(Application.CONFIGURATION, "deployment"); // development @@ -200,24 +206,24 @@ public FilterRegistrationBean wicket() { } @Bean - public FilterRegistrationBean springSecurityFilterChain() { - FilterRegistrationBean registration = new FilterRegistrationBean(); + public FilterRegistrationBean springSecurityFilterChain() { + FilterRegistrationBean registration = new FilterRegistrationBean<>(); registration.setFilter(new DelegatingFilterProxy()); registration.addUrlPatterns("/*"); return registration; } @Bean - public FilterRegistrationBean webResourceOptimizer(WroFilter wroFilter) { - FilterRegistrationBean registration = new FilterRegistrationBean(); + public FilterRegistrationBean webResourceOptimizer(WroFilter wroFilter) { + FilterRegistrationBean registration = new FilterRegistrationBean<>(); registration.setFilter(wroFilter); registration.addUrlPatterns("/wro/*"); return registration; } @Bean - public ServletRegistrationBean cxfServlet() { - ServletRegistrationBean registration = new ServletRegistrationBean(); + public ServletRegistrationBean cxfServlet() { + ServletRegistrationBean registration = new ServletRegistrationBean<>(); registration.setServlet(new CXFServlet()); registration.addInitParameter("service-list-path", "midpointservices"); registration.setLoadOnStartup(1); @@ -227,8 +233,8 @@ public ServletRegistrationBean cxfServlet() { } @Bean - public ServletRegistrationBean reportPeerQueryInterceptor() { - ServletRegistrationBean registration = new ServletRegistrationBean(); + public ServletRegistrationBean reportPeerQueryInterceptor() { + ServletRegistrationBean registration = new ServletRegistrationBean<>(); registration.setServlet(new ReportPeerQueryInterceptor(nodeAuthenticator)); registration.addUrlMappings("/report"); @@ -236,8 +242,8 @@ public ServletRegistrationBean reportPeerQueryInterceptor() { } @Bean - public ServletRegistrationBean staticWebServlet() { - ServletRegistrationBean registration = new ServletRegistrationBean(); + public ServletRegistrationBean staticWebServlet() { + ServletRegistrationBean registration = new ServletRegistrationBean<>(); StaticWebServlet servlet = new StaticWebServlet( new File(startupConfiguration.getMidpointHome(), "static-web")); registration.setServlet(servlet); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java index d2e12f5a3f5..fc12e26c461 100755 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java @@ -23,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.security.SecurityProperties; +import org.springframework.boot.web.server.ErrorPageRegistrar; import org.springframework.context.annotation.*; import org.springframework.core.annotation.Order; import org.springframework.core.env.Environment; @@ -160,6 +161,11 @@ protected void configure(HttpSecurity http) throws Exception { http.addFilterBefore(requestHeaderAuthenticationFilter(), LogoutFilter.class); } } + + @Bean + public ErrorPageRegistrar errorPageRegistrar() { + return new MidPointErrorPageRegistrar(); + } @Bean @Override diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.java index 34cf41cbe29..63e1a3f1ed0 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.java @@ -196,6 +196,12 @@ public class MidPointApplication extends AuthenticatedWebApplication { transient ApplicationContext applicationContext; private WebApplicationConfiguration webApplicationConfiguration; + + public static final String MOUNT_INTERNAL_SERVER_ERROR = "/error"; + public static final String MOUNT_UNAUTHORIZED_ERROR = "/error/401"; + public static final String MOUNT_FORBIDEN_ERROR = "/error/403"; + public static final String MOUNT_NOT_FOUND_ERROR = "/error/404"; + public static final String MOUNT_GONE_ERROR = "/error/410"; @Override public Class getHomePage() { @@ -252,11 +258,11 @@ public void init() { appSettings.setInternalErrorPage(PageError.class); appSettings.setPageExpiredErrorPage(PageError.class); - mount(new MountedMapper("/error", PageError.class, new PageParametersEncoder())); - mount(new MountedMapper("/error/401", PageError401.class, new PageParametersEncoder())); - mount(new MountedMapper("/error/403", PageError403.class, new PageParametersEncoder())); - mount(new MountedMapper("/error/404", PageError404.class, new PageParametersEncoder())); - mount(new MountedMapper("/error/410", PageError410.class, new PageParametersEncoder())); + mount(new MountedMapper(MOUNT_INTERNAL_SERVER_ERROR, PageError.class, new PageParametersEncoder())); + mount(new MountedMapper(MOUNT_UNAUTHORIZED_ERROR, PageError401.class, new PageParametersEncoder())); + mount(new MountedMapper(MOUNT_FORBIDEN_ERROR, PageError403.class, new PageParametersEncoder())); + mount(new MountedMapper(MOUNT_NOT_FOUND_ERROR, PageError404.class, new PageParametersEncoder())); + mount(new MountedMapper(MOUNT_GONE_ERROR, PageError410.class, new PageParametersEncoder())); getRequestCycleListeners().add(new LoggingRequestCycleListener(this));