From 4f042a4ff127916ebe6d2d876dc97d8785c4894b Mon Sep 17 00:00:00 2001 From: Eleftheria Stein Date: Mon, 3 Jun 2019 11:09:49 -0400 Subject: [PATCH] Migrate ChannelSecurityConfigurerTests groovy->java Issue: gh-4939 --- .../ChannelSecurityConfigurerTests.groovy | 78 ---------- .../ChannelSecurityConfigurerTests.java | 138 ++++++++++++++++++ 2 files changed, 138 insertions(+), 78 deletions(-) delete mode 100644 config/src/test/groovy/org/springframework/security/config/annotation/web/configurers/ChannelSecurityConfigurerTests.groovy create mode 100644 config/src/test/java/org/springframework/security/config/annotation/web/configurers/ChannelSecurityConfigurerTests.java diff --git a/config/src/test/groovy/org/springframework/security/config/annotation/web/configurers/ChannelSecurityConfigurerTests.groovy b/config/src/test/groovy/org/springframework/security/config/annotation/web/configurers/ChannelSecurityConfigurerTests.groovy deleted file mode 100644 index 3050183720f..00000000000 --- a/config/src/test/groovy/org/springframework/security/config/annotation/web/configurers/ChannelSecurityConfigurerTests.groovy +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2002-2013 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.security.config.annotation.web.configurers - -import org.springframework.context.annotation.Configuration -import org.springframework.security.config.annotation.AnyObjectPostProcessor -import org.springframework.security.config.annotation.BaseSpringSpec -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder -import org.springframework.security.config.annotation.web.builders.HttpSecurity -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter -import org.springframework.security.web.access.channel.ChannelDecisionManagerImpl -import org.springframework.security.web.access.channel.ChannelProcessingFilter -import org.springframework.security.web.access.channel.InsecureChannelProcessor -import org.springframework.security.web.access.channel.SecureChannelProcessor - -/** - * - * @author Rob Winch - */ -class ChannelSecurityConfigurerTests extends BaseSpringSpec { - - def "requiresChannel ObjectPostProcessor"() { - setup: "initialize the AUTH_FILTER as a mock" - AnyObjectPostProcessor objectPostProcessor = Mock() - when: - HttpSecurity http = new HttpSecurity(objectPostProcessor, authenticationBldr, [:]) - http - .requiresChannel() - .anyRequest().requiresSecure() - .and() - .build() - - then: "InsecureChannelProcessor is registered with LifecycleManager" - 1 * objectPostProcessor.postProcess(_ as InsecureChannelProcessor) >> {InsecureChannelProcessor o -> o} - and: "SecureChannelProcessor is registered with LifecycleManager" - 1 * objectPostProcessor.postProcess(_ as SecureChannelProcessor) >> {SecureChannelProcessor o -> o} - and: "ChannelDecisionManagerImpl is registered with LifecycleManager" - 1 * objectPostProcessor.postProcess(_ as ChannelDecisionManagerImpl) >> {ChannelDecisionManagerImpl o -> o} - and: "ChannelProcessingFilter is registered with LifecycleManager" - 1 * objectPostProcessor.postProcess(_ as ChannelProcessingFilter) >> {ChannelProcessingFilter o -> o} - } - - def "invoke requiresChannel twice does not override"() { - setup: - loadConfig(DuplicateInvocationsDoesNotOverrideConfig) - when: - springSecurityFilterChain.doFilter(request,response,chain) - then: - response.redirectedUrl == "https://localhost" - } - - @EnableWebSecurity - static class DuplicateInvocationsDoesNotOverrideConfig extends WebSecurityConfigurerAdapter { - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .requiresChannel() - .anyRequest().requiresSecure() - .and() - .requiresChannel() - } - } -} diff --git a/config/src/test/java/org/springframework/security/config/annotation/web/configurers/ChannelSecurityConfigurerTests.java b/config/src/test/java/org/springframework/security/config/annotation/web/configurers/ChannelSecurityConfigurerTests.java new file mode 100644 index 00000000000..c755c5f3a37 --- /dev/null +++ b/config/src/test/java/org/springframework/security/config/annotation/web/configurers/ChannelSecurityConfigurerTests.java @@ -0,0 +1,138 @@ +/* + * Copyright 2002-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.security.config.annotation.web.configurers; + +import org.junit.Rule; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.security.config.annotation.ObjectPostProcessor; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.test.SpringTestRule; +import org.springframework.security.web.access.channel.ChannelDecisionManagerImpl; +import org.springframework.security.web.access.channel.ChannelProcessingFilter; +import org.springframework.security.web.access.channel.InsecureChannelProcessor; +import org.springframework.security.web.access.channel.SecureChannelProcessor; +import org.springframework.test.web.servlet.MockMvc; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl; + +/** + * Tests for {@link ChannelSecurityConfigurer} + * + * @author Rob Winch + * @author Eleftheria Stein + */ +public class ChannelSecurityConfigurerTests { + + @Rule + public final SpringTestRule spring = new SpringTestRule(); + + @Autowired + MockMvc mvc; + + @Test + public void configureWhenRegisteringObjectPostProcessorThenInvokedOnInsecureChannelProcessor() { + ObjectPostProcessorConfig.objectPostProcessor = spy(ReflectingObjectPostProcessor.class); + this.spring.register(ObjectPostProcessorConfig.class).autowire(); + + verify(ObjectPostProcessorConfig.objectPostProcessor) + .postProcess(any(InsecureChannelProcessor.class)); + } + + @Test + public void configureWhenRegisteringObjectPostProcessorThenInvokedOnSecureChannelProcessor() { + ObjectPostProcessorConfig.objectPostProcessor = spy(ReflectingObjectPostProcessor.class); + this.spring.register(ObjectPostProcessorConfig.class).autowire(); + + verify(ObjectPostProcessorConfig.objectPostProcessor) + .postProcess(any(SecureChannelProcessor.class)); + } + + @Test + public void configureWhenRegisteringObjectPostProcessorThenInvokedOnChannelDecisionManagerImpl() { + ObjectPostProcessorConfig.objectPostProcessor = spy(ReflectingObjectPostProcessor.class); + this.spring.register(ObjectPostProcessorConfig.class).autowire(); + + verify(ObjectPostProcessorConfig.objectPostProcessor) + .postProcess(any(ChannelDecisionManagerImpl.class)); + } + + @Test + public void configureWhenRegisteringObjectPostProcessorThenInvokedOnChannelProcessingFilter() { + ObjectPostProcessorConfig.objectPostProcessor = spy(ReflectingObjectPostProcessor.class); + this.spring.register(ObjectPostProcessorConfig.class).autowire(); + + verify(ObjectPostProcessorConfig.objectPostProcessor) + .postProcess(any(ChannelProcessingFilter.class)); + } + + @EnableWebSecurity + static class ObjectPostProcessorConfig extends WebSecurityConfigurerAdapter { + static ObjectPostProcessor objectPostProcessor; + + @Override + protected void configure(HttpSecurity http) throws Exception { + // @formatter:off + http + .requiresChannel() + .anyRequest().requiresSecure(); + // @formatter:on + } + + @Bean + static ObjectPostProcessor objectPostProcessor() { + return objectPostProcessor; + } + } + + static class ReflectingObjectPostProcessor implements ObjectPostProcessor { + @Override + public O postProcess(O object) { + return object; + } + } + + @Test + public void requiresChannelWhenInvokesTwiceThenUsesOriginalRequiresSecure() throws Exception { + this.spring.register(DuplicateInvocationsDoesNotOverrideConfig.class).autowire(); + + mvc.perform(get("/")) + .andExpect(redirectedUrl("https://localhost/")); + } + + @EnableWebSecurity + static class DuplicateInvocationsDoesNotOverrideConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + // @formatter:off + http + .requiresChannel() + .anyRequest().requiresSecure() + .and() + .requiresChannel(); + // @formatter:on + } + } +}