【问题标题】:How to prevent a property beeing set on certain profile如何防止在某些配置文件上设置属性
【发布时间】:2018-06-04 06:57:51
【问题描述】:

我们希望通过在登录请求中发送他/她希望拥有的角色来实现使用户能够在系统中选择角色的功能。

此功能用于测试(在客户系统中创建测试用户或将角色分配给现有用户是“不可能的”),当然,永远不应该部署到生产环境中。

如果属性feature.choose-role 设置为true 并且spring active profile 设置为production,我希望我的应用程序部署失败。

由于我们正在使用 springs config-server 功能,如果在运行时将属性设置为 true,我还希望应用程序完全停止工作。

我的第一次尝试是简单地创建这个配置:

@Configuration
public class FeatureToggleGuardConfig {

    @Bean
    @RefreshScope
    @ConditionalOnProperty(value = "feature.choose-roles", havingValue = "true")
    @Profile("production")
    public Object preventDeploymentOfRoleChoosingFeatureOnProduction() {
        throw new RuntimeException("feature.choose-roles must not be true in production profile!");
    }
}

如果该属性在部署时设置为 true,则此方法有效,但据我所知,只有在有人真正尝试使用它时才会尝试刷新 bean - 这永远不会发生。

另外 - 我不认为它会停止整个应用程序,如果它只是在使用时抛出运行时异常。

简而言之:

如果属性feature.choose-roles 为真且活动配置文件为“生产”,我想阻止我的应用程序运行(或继续运行)。

我不想更改生产代码来执行此操作(if(feature is enables && profile is production) 等)

【问题讨论】:

    标签: spring spring-boot


    【解决方案1】:

    也许您可以让您的配置文件驱动一个配置 bean,而不是让您的配置文件驱动某种阻止程序,该配置 bean 说明是否使用该功能。然后,从您的属性中读取 nonProd 配置,并让 prod 配置始终返回 false。

    类似:

    public interface ChooseRolesConfig {
    
        boolean allowChoosingRoles();
    }
    
    @Profile("!production")
    public class NonProdChooseRolesConfig implements ChooseRolesConfig {
    
        @Value("${feature.choose-roles}")
        boolean chooseRoles;
    
        @Override
        public boolean allowChoosingRoles() {
            return chooseRoles;
        }
    }
    
    @Profile("production")
    public class ProdChooseRolesConfig implements ChooseRolesConfig {
    
        @Override
        public boolean allowChoosingRoles() {
            return false;
        }
    }
    

    然后只需自动装配一个 ChooseRolesConfig 对象,然后调用该方法,无论您将 feature.choose-roles 更改为使用云配置,它对于 prod 应该始终为 false。

    免责声明:我盲目地写了这个,所以它可能会遗漏一些注释或其他东西,但希望你能明白

    【讨论】:

    • 我宁愿一开始就不要接受错误配置,而不是尽可能通过忽略无效输入来解决它。
    • @billdoor 如果您愿意,如果 @Value("${feature.choose-roles}") boolean chooseRoles; 设置为 true,您可以更改产品配置以引发异常
    猜你喜欢
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 2022-09-23
    • 2021-08-05
    • 1970-01-01
    相关资源
    最近更新 更多