From cdcbbca6a48f24b43e3f9ee363b8b911e3808503 Mon Sep 17 00:00:00 2001 From: John Blum Date: Fri, 3 May 2019 19:15:31 -0700 Subject: [PATCH] Encapsulate configuration of Apache Geode/Pivotal GemFire (PCC) Security (Auth) using an enabling Annotation with the CacheFactory API. --- .../annotation/EnableSecurityManager.java | 49 ++++++++++ .../SecurityManagerConfiguration.java | 47 ++++++++++ ...yManagerConfigurationIntegrationTests.java | 89 +++++++++++++++++++ 3 files changed, 185 insertions(+) create mode 100644 spring-geode/src/main/java/org/springframework/geode/config/annotation/EnableSecurityManager.java create mode 100644 spring-geode/src/main/java/org/springframework/geode/config/annotation/SecurityManagerConfiguration.java create mode 100644 spring-geode/src/test/java/org/springframework/geode/config/annotation/SecurityManagerConfigurationIntegrationTests.java diff --git a/spring-geode/src/main/java/org/springframework/geode/config/annotation/EnableSecurityManager.java b/spring-geode/src/main/java/org/springframework/geode/config/annotation/EnableSecurityManager.java new file mode 100644 index 00000000..3065dc92 --- /dev/null +++ b/spring-geode/src/main/java/org/springframework/geode/config/annotation/EnableSecurityManager.java @@ -0,0 +1,49 @@ +/* + * Copyright 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.geode.config.annotation; + +import java.lang.annotation.Annotation; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.context.annotation.Import; + +/** + * Spring {@link Annotation} to enable Apache Geode or Pivotal GemFire (PCC) Security (Auth). + * + * @author John Blum + * @see java.lang.annotation.Annotation + * @see java.lang.annotation.Documented + * @see java.lang.annotation.Inherited + * @see java.lang.annotation.Retention + * @see java.lang.annotation.Target + * @see org.springframework.context.annotation.Import + * @see org.springframework.geode.config.annotation.SecurityManagerConfiguration + * @since 1.1.0 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +@Documented +@Import(SecurityManagerConfiguration.class) +@SuppressWarnings("unused") +public @interface EnableSecurityManager { + +} diff --git a/spring-geode/src/main/java/org/springframework/geode/config/annotation/SecurityManagerConfiguration.java b/spring-geode/src/main/java/org/springframework/geode/config/annotation/SecurityManagerConfiguration.java new file mode 100644 index 00000000..8e82e798 --- /dev/null +++ b/spring-geode/src/main/java/org/springframework/geode/config/annotation/SecurityManagerConfiguration.java @@ -0,0 +1,47 @@ +/* + * Copyright 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.geode.config.annotation; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.gemfire.config.annotation.ClientCacheConfigurer; +import org.springframework.data.gemfire.config.annotation.PeerCacheConfigurer; + +/** + * Spring {@link Configuration} class used to configure a {@link org.apache.geode.security.SecurityManager}, + * thereby enabling Security (Auth) on this GemFire/Geode node. + * + * @author John Blum + * @see org.springframework.context.annotation.Bean + * @see org.springframework.context.annotation.Configuration + * @see org.springframework.data.gemfire.config.annotation.ClientCacheConfigurer + * @see org.springframework.data.gemfire.config.annotation.PeerCacheConfigurer + * @since 1.1.0 + */ +@Configuration +@SuppressWarnings("unused") +public class SecurityManagerConfiguration { + + @Bean + ClientCacheConfigurer clientSecurityManagerConfigurer(org.apache.geode.security.SecurityManager securityManager) { + return (beanName, clientCacheFactoryBean) -> clientCacheFactoryBean.setSecurityManager(securityManager); + } + + @Bean + PeerCacheConfigurer peerSecurityManagerConfigurer(org.apache.geode.security.SecurityManager securityManager) { + return (beanName, cacheFactoryBean) -> cacheFactoryBean.setSecurityManager(securityManager); + } +} diff --git a/spring-geode/src/test/java/org/springframework/geode/config/annotation/SecurityManagerConfigurationIntegrationTests.java b/spring-geode/src/test/java/org/springframework/geode/config/annotation/SecurityManagerConfigurationIntegrationTests.java new file mode 100644 index 00000000..6f7baa0c --- /dev/null +++ b/spring-geode/src/test/java/org/springframework/geode/config/annotation/SecurityManagerConfigurationIntegrationTests.java @@ -0,0 +1,89 @@ +/* + * Copyright 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.geode.config.annotation; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.data.gemfire.CacheFactoryBean; +import org.springframework.data.gemfire.config.annotation.ClientCacheApplication; +import org.springframework.data.gemfire.tests.mock.annotation.EnableGemFireMockObjects; +import org.springframework.geode.security.support.SecurityManagerProxy; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * Integration tests for {@link EnableSecurityManager} and {@link SecurityManagerConfiguration}. + * + * @author John Blum + * @see org.junit.Test + * @see org.mockito.Mockito + * @see org.apache.geode.security.SecurityManager + * @see org.springframework.data.gemfire.CacheFactoryBean + * @see org.springframework.data.gemfire.config.annotation.ClientCacheApplication + * @see org.springframework.data.gemfire.tests.mock.annotation.EnableGemFireMockObjects + * @see org.springframework.geode.security.support.SecurityManagerProxy + * @see org.springframework.test.context.ContextConfiguration + * @see org.springframework.test.context.junit4.SpringRunner + * @since 1.1.0 + */ +@RunWith(SpringRunner.class) +@ContextConfiguration +public class SecurityManagerConfigurationIntegrationTests { + + private static final String GEMFIRE_LOG_LEVEL = "error"; + + @Autowired + public CacheFactoryBean cacheFactoryBean; + + @Autowired + private org.apache.geode.security.SecurityManager securityManager; + + @Test + public void securityManagerBeanIsConfigured() { + assertThat(this.cacheFactoryBean.getSecurityManager()).isEqualTo(this.securityManager); + } + + @Test(expected = IllegalStateException.class) + public void securityManagerProxyIsNotUsed() { + + try { + SecurityManagerProxy.getInstance(); + } + catch (IllegalStateException expected) { + + assertThat(expected).hasMessage("SecurityManagerProxy was not configured"); + assertThat(expected).hasNoCause(); + + throw expected; + } + } + + @ClientCacheApplication(logLevel = GEMFIRE_LOG_LEVEL) + @EnableGemFireMockObjects + @EnableSecurityManager + static class TestConfiguration { + + @Bean + org.apache.geode.security.SecurityManager mockSecurityManager() { + return mock(org.apache.geode.security.SecurityManager.class); + } + } +}