From d8063a4c616a59d6866e26181d8e6131dc6d2e8d Mon Sep 17 00:00:00 2001 From: Scott Murphy Heiberg Date: Mon, 26 Aug 2024 13:13:01 -0700 Subject: [PATCH] Register separate filter when Spring security is installed --- .../SiteMeshAutoConfiguration.java | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/spring-boot-starter-sitemesh/src/main/java/org/sitemesh/autoconfigure/SiteMeshAutoConfiguration.java b/spring-boot-starter-sitemesh/src/main/java/org/sitemesh/autoconfigure/SiteMeshAutoConfiguration.java index e2a7db2..db4ddd1 100644 --- a/spring-boot-starter-sitemesh/src/main/java/org/sitemesh/autoconfigure/SiteMeshAutoConfiguration.java +++ b/spring-boot-starter-sitemesh/src/main/java/org/sitemesh/autoconfigure/SiteMeshAutoConfiguration.java @@ -16,14 +16,16 @@ package org.sitemesh.autoconfigure; +import jakarta.servlet.http.HttpServletRequest; import org.sitemesh.builder.SiteMeshFilterBuilder; import org.sitemesh.config.ConfigurableSiteMeshFilter; import org.sitemesh.config.MetaTagBasedDecoratorSelector; import org.sitemesh.config.RequestAttributeDecoratorSelector; import org.sitemesh.content.tagrules.TagRuleBundle; -import org.sitemesh.content.tagrules.html.Sm2TagRuleBundle; import org.sitemesh.webapp.WebAppContext; +import org.sitemesh.webapp.contentfilter.BasicSelector; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; @@ -63,7 +65,7 @@ public void setMappings(List> mappings) { private int filterOrder; public static ConfigurableSiteMeshFilter makeFilter(String attribute, String defaultPath, String metaTagName, String prefix, - List> mappings, List exclusions, List bundles, boolean includeErrorPages) { + List> mappings, List exclusions, List bundles, boolean includeErrorPages, boolean alwaysApply) { return new ConfigurableSiteMeshFilter() { @Override protected void applyCustomConfiguration(SiteMeshFilterBuilder builder) { @@ -91,6 +93,14 @@ protected void applyCustomConfiguration(SiteMeshFilterBuilder builder) { for (String bundle : bundles) { builder.addTagRuleBundle((TagRuleBundle) getObjectFactory().create(bundle)); } + if (alwaysApply) { + builder.setCustomSelector(new BasicSelector() { + @Override + public boolean shouldBufferForRequest(HttpServletRequest request) { + return true; + } + }); + } builder.setIncludeErrorPages(includeErrorPages); } }; @@ -99,7 +109,7 @@ protected void applyCustomConfiguration(SiteMeshFilterBuilder builder) { @Bean @ConditionalOnMissingBean(name = "siteMeshFilter") ConfigurableSiteMeshFilter siteMeshFilter() { - return makeFilter(attribute, defaultPath, metaTagName, prefix, mappings, exclusions, bundles, includeErrorPages); + return makeFilter(attribute, defaultPath, metaTagName, prefix, mappings, exclusions, bundles, includeErrorPages, false); } @Bean @@ -115,4 +125,19 @@ public FilterRegistrationBean sitemesh3(Configurable registrationBean.setOrder(filterOrder); return registrationBean; } + + @Bean + @ConditionalOnMissingBean(name = "sitemesh3Secured") + @ConditionalOnClass(name = "org.springframework.security.config.annotation.web.configuration.EnableWebSecurity") + public FilterRegistrationBean sitemesh3Secured(ConfigurableSiteMeshFilter siteMeshFilter){ + FilterRegistrationBean registrationBean + = new FilterRegistrationBean<>(); + registrationBean.setFilter(makeFilter(attribute, defaultPath, metaTagName, prefix, mappings, exclusions, bundles, includeErrorPages, true)); + registrationBean.addUrlPatterns("/*"); + if (includeErrorPages) { + registrationBean.setDispatcherTypes(EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR)); + } + registrationBean.setOrder(org.springframework.boot.autoconfigure.security.SecurityProperties.BASIC_AUTH_ORDER - 9); + return registrationBean; + } } \ No newline at end of file