diff --git a/polaris-agent-plugins/spring-cloud-plugins/spring-cloud-2023-plugin/pom.xml b/polaris-agent-plugins/spring-cloud-plugins/spring-cloud-2023-plugin/pom.xml index 44588475..35621446 100644 --- a/polaris-agent-plugins/spring-cloud-plugins/spring-cloud-2023-plugin/pom.xml +++ b/polaris-agent-plugins/spring-cloud-plugins/spring-cloud-2023-plugin/pom.xml @@ -373,7 +373,16 @@ - + + com.tencent.cloud + spring-cloud-starter-tencent-polaris-auth + + + spring-cloud-starter-tencent-metadata-transfer + com.tencent.cloud + + + com.tencent.cloud spring-cloud-starter-tencent-discovery-adapter-plugin @@ -429,7 +438,6 @@ - diff --git a/polaris-agent-plugins/spring-cloud-plugins/spring-cloud-2023-plugin/src/main/java/cn/polarismesh/agent/plugin/spring/cloud/inject/AuthBeanInjector.java b/polaris-agent-plugins/spring-cloud-plugins/spring-cloud-2023-plugin/src/main/java/cn/polarismesh/agent/plugin/spring/cloud/inject/AuthBeanInjector.java new file mode 100644 index 00000000..a7d05432 --- /dev/null +++ b/polaris-agent-plugins/spring-cloud-plugins/spring-cloud-2023-plugin/src/main/java/cn/polarismesh/agent/plugin/spring/cloud/inject/AuthBeanInjector.java @@ -0,0 +1,99 @@ +/* + * Tencent is pleased to support the open source community by making polaris-java-agent available. + * + * Copyright (C) 2021 Tencent. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 cn.polarismesh.agent.plugin.spring.cloud.inject; + +import cn.polarismesh.agent.core.common.utils.ClassUtils; +import cn.polarismesh.agent.core.common.utils.ReflectionUtils; +import cn.polarismesh.agent.plugin.spring.cloud.common.BeanInjector; +import cn.polarismesh.agent.plugin.spring.cloud.common.Constant; +import cn.polarismesh.agent.plugin.spring.cloud.common.Utils; +import com.tencent.cloud.polaris.auth.config.PolarisAuthAutoConfiguration; +import com.tencent.cloud.polaris.auth.config.PolarisAuthPropertiesAutoConfiguration; +import com.tencent.cloud.polaris.auth.config.PolarisAuthPropertiesBootstrapConfiguration; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.concurrent.atomic.AtomicBoolean; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.core.env.Environment; + +public class AuthBeanInjector implements BeanInjector { + + private static final Logger LOGGER = LoggerFactory.getLogger(AuthBeanInjector.class); + + private final AtomicBoolean bootstrapLoaded = new AtomicBoolean(false); + + @Override + public String getModule() { + return "spring-cloud-starter-tencent-polaris-auth"; + } + + @Override + public void onBootstrapStartup(Object configurationParser, Constructor configClassCreator, + Method processConfigurationClass, BeanDefinitionRegistry registry, Environment environment) { + if (!(Utils.checkPolarisEnabled(environment) && Utils.checkKeyEnabled(environment, + "spring.cloud.polaris.auth.enabled"))) { + LOGGER.warn( + "[PolarisJavaAgent] polaris auth not enabled, skip inject bootstrap bean definitions for module {}", + getModule()); + return; + } + bootstrapLoaded.set(true); + Object polarisAuthPropertiesBootstrapConfiguration = ReflectionUtils.invokeConstructor(configClassCreator, + PolarisAuthPropertiesBootstrapConfiguration.class, "polarisAuthPropertiesBootstrapConfiguration"); + ReflectionUtils.invokeMethod(processConfigurationClass, configurationParser, + polarisAuthPropertiesBootstrapConfiguration, Constant.DEFAULT_EXCLUSION_FILTER); + registry.registerBeanDefinition("polarisAuthPropertiesBootstrapConfiguration", + BeanDefinitionBuilder.genericBeanDefinition(PolarisAuthPropertiesBootstrapConfiguration.class) + .getBeanDefinition()); + LOGGER.info("[PolarisJavaAgent] success to inject bootstrap bean definitions for module {}", getModule()); + } + + @Override + public void onApplicationStartup(Object configurationParser, Constructor configClassCreator, + Method processConfigurationClass, BeanDefinitionRegistry registry, Environment environment) { + if (!(Utils.checkPolarisEnabled(environment) && Utils.checkKeyEnabled(environment, + "spring.cloud.polaris.auth.enabled"))) { + LOGGER.warn( + "[PolarisJavaAgent] polaris not enabled, skip inject application bean definitions for module {}", + getModule()); + return; + } + if (!bootstrapLoaded.get()) { + onBootstrapStartup(configurationParser, configClassCreator, processConfigurationClass, registry, + environment); + } + Object polarisAuthAutoConfiguration = ReflectionUtils.invokeConstructor(configClassCreator, + PolarisAuthAutoConfiguration.class, "polarisAuthAutoConfiguration"); + ReflectionUtils.invokeMethod(processConfigurationClass, configurationParser, + polarisAuthAutoConfiguration, Constant.DEFAULT_EXCLUSION_FILTER); + registry.registerBeanDefinition("polarisAuthAutoConfiguration", + BeanDefinitionBuilder.genericBeanDefinition(PolarisAuthAutoConfiguration.class) + .getBeanDefinition()); + Object polarisAuthPropertiesAutoConfiguration = ReflectionUtils.invokeConstructor(configClassCreator, + PolarisAuthPropertiesAutoConfiguration.class, "polarisAuthPropertiesAutoConfiguration"); + ReflectionUtils.invokeMethod(processConfigurationClass, configurationParser, + polarisAuthPropertiesAutoConfiguration, Constant.DEFAULT_EXCLUSION_FILTER); + registry.registerBeanDefinition("polarisAuthPropertiesAutoConfiguration", + BeanDefinitionBuilder.genericBeanDefinition(PolarisAuthPropertiesAutoConfiguration.class) + .getBeanDefinition()); + LOGGER.info("[PolarisJavaAgent] success to inject application bean definitions for module {}", getModule()); + } +} diff --git a/polaris-agent-plugins/spring-cloud-plugins/spring-cloud-2023-plugin/src/main/java/cn/polarismesh/agent/plugin/spring/cloud/interceptor/ConfigurationParserInterceptor.java b/polaris-agent-plugins/spring-cloud-plugins/spring-cloud-2023-plugin/src/main/java/cn/polarismesh/agent/plugin/spring/cloud/interceptor/ConfigurationParserInterceptor.java index a6ed6d6a..f28ffe55 100644 --- a/polaris-agent-plugins/spring-cloud-plugins/spring-cloud-2023-plugin/src/main/java/cn/polarismesh/agent/plugin/spring/cloud/interceptor/ConfigurationParserInterceptor.java +++ b/polaris-agent-plugins/spring-cloud-plugins/spring-cloud-2023-plugin/src/main/java/cn/polarismesh/agent/plugin/spring/cloud/interceptor/ConfigurationParserInterceptor.java @@ -56,6 +56,7 @@ public ConfigurationParserInterceptor() { beanInjectors.add(new RouterBeanInjector()); beanInjectors.add(new CircuitBreakerBeanInjector()); beanInjectors.add(new RateLimitBeanInjector()); + beanInjectors.add(new AuthBeanInjector()); } diff --git a/polaris-agent-plugins/spring-cloud-plugins/spring-cloud-2023-plugin/src/main/java/cn/polarismesh/agent/plugin/spring/cloud/interceptor/SpringFactoriesLoaderInterceptor.java b/polaris-agent-plugins/spring-cloud-plugins/spring-cloud-2023-plugin/src/main/java/cn/polarismesh/agent/plugin/spring/cloud/interceptor/SpringFactoriesLoaderInterceptor.java index dd01e1b4..3c3108ee 100644 --- a/polaris-agent-plugins/spring-cloud-plugins/spring-cloud-2023-plugin/src/main/java/cn/polarismesh/agent/plugin/spring/cloud/interceptor/SpringFactoriesLoaderInterceptor.java +++ b/polaris-agent-plugins/spring-cloud-plugins/spring-cloud-2023-plugin/src/main/java/cn/polarismesh/agent/plugin/spring/cloud/interceptor/SpringFactoriesLoaderInterceptor.java @@ -45,6 +45,7 @@ public SpringFactoriesLoaderInterceptor() { beanInjectors.add(new RouterBeanInjector()); beanInjectors.add(new CircuitBreakerBeanInjector()); beanInjectors.add(new RateLimitBeanInjector()); + beanInjectors.add(new AuthBeanInjector()); } @SuppressWarnings("unchecked")