• springboot + nacos + aws secretmanager 做账号密码隐私处理


    方式一:

    1. #nacos配置文件
    2. data.yml:
    3. spring:
    4.   cloud:
    5.     nacos:
    6.       discovery:
    7.         ip: ****.com
    8.         port: 80
    9.   datasource:
    10.     driver-class-name: com.mysql.cj.jdbc.Driver
    11.     url: jdbc:mysql://*********/database?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull
    12.     hikari:
    13.       idle-timeout: 60000
    14.       connection-timeout: 60000
    15.       validation-timeout: 3000
    16.       login-timeout: 5
    17.       max-lifetime: 60000
    18.       maximum-pool-size: 20
    19. #项目配置文件
    20. bootstrap-test.yml
    21. spring:
    22.   cloud:
    23.     nacos:
    24.       discovery:
    25.         server-addr: http://nacos-headless:8848
    26.       config:
    27.         server-addr: http://nacos-headless:8848
    28.         namespace: TEST
    29.         file-extension: yml
    30.         extension-configs:
    31.           - group: DEFAULT_GROUP
    32.             data-id: global.yml
    33.           - group: common
    34.             data-id: common.yml
    35.           - group: data
    36.             data-id: db.yml
    37.             refresh: true
    38. sm: 
    39.   region: eu-central-1
    40.   doc: dev-fra-as-api-mongodb-user-root-ZMEAVyQppET6GPf
    41.   rdsp: dev-fra-as-api-rds-user-root-xp78N8GvtScLmGn
    42.   rdss: dev-fra-as-pms-rds-v2-readonly-from-sin-user-fra-appplayer-gp3Sex9vbXDU6PL
    43. 代码
    44. package com.yuruo.reco.config;
    45. import java.util.HashMap;
    46. import java.util.Map;
    47. import org.springframework.boot.SpringApplication;
    48. import org.springframework.boot.env.EnvironmentPostProcessor;
    49. import org.springframework.core.env.ConfigurableEnvironment;
    50. import org.springframework.core.env.MapPropertySource;
    51. import org.springframework.core.env.MutablePropertySources;
    52. import org.springframework.core.env.PropertySource;
    53. import com.yuruo.reco.dto.SecretDto;
    54. import com.yuruo.reco.utils.JsonUtils;
    55. import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
    56. import software.amazon.awssdk.regions.Region;
    57. import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient;
    58. import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest;
    59. public class SecretsManagerEnvironmentPostProcessor implements EnvironmentPostProcessor {
    60.     @Override
    61.     public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
    62.         MutablePropertySources propertySources = environment.getPropertySources();
    63.         for (PropertySource propertySource : propertySources) {
    64.             if (propertySource.getName().contains("[bootstrap-" + environment.getActiveProfiles()[0] + ".yml]")) {
    65.                 Region region = Region.of(propertySource.getProperty("sm.region").toString());
    66.                 SecretsManagerClient client = SecretsManagerClient.builder().region(region).credentialsProvider(DefaultCredentialsProvider.create()).build();
    67.                 // 读取配置
    68.                 String primarySecret = getSecretRes(client, propertySource.getProperty("sm.rdsp").toString());
    69.                 SecretDto secret = JsonUtils.stringToJavaObject(primarySecret, SecretDto.class);
    70.                 Map source = new HashMap<>();
    71.                 source.put("spring.datasource.primary.username", secret.getUsername());
    72.                 source.put("spring.datasource.primary.password", secret.getPassword());
    73.                 String secondarySecret = getSecretRes(client, propertySource.getProperty("sm.rdss").toString());
    74.                 secret = JsonUtils.stringToJavaObject(secondarySecret, SecretDto.class);
    75.                 source.put("spring.datasource.secondary.username", secret.getUsername());
    76.                 source.put("spring.datasource.secondary.password", secret.getPassword());
    77.                 String mongosecret = getSecretRes(client, propertySource.getProperty("sm.doc").toString());
    78.                 secret = JsonUtils.stringToJavaObject(mongosecret, SecretDto.class);
    79.                 source.put("spring.data.mongodb.uri", "mongodb://" + secret.getUsername() + ":" + secret.getPassword()
    80.                         + "@" + secret.getHost() + ":" + secret.getPort());
    81.                 propertySources.addLast(new MapPropertySource("secretsManagerPropertySource", source));
    82.             }
    83.         }
    84.     }
    85.     private String getSecretRes(SecretsManagerClient client, String secretName) {
    86.         GetSecretValueRequest request = GetSecretValueRequest.builder().secretId(secretName).build();
    87.         return client.getSecretValue(request).secretString();
    88.     }
    89. }

    方式二:

    1. src/main/resources/META-INF/spring.factories
    2. org.springframework.boot.env.EnvironmentPostProcessor=com.yuruo.reco.config.SecretsManagerEnvironmentPostProcessor
    3. spring:
    4. jpa:
    5. properties:
    6. hibernate:
    7. dialect: org.hibernate.dialect.MySQL8Dialect
    8. cloud:
    9. nacos:
    10. discovery:
    11. ip: ****.com
    12. port: 80
    13. datasource:
    14. driver-class-name: com.mysql.cj.jdbc.Driver
    15. url: jdbc:mysql://*********/database?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull
    16. username: ${DB_USETRNAME}
    17. password: ${DB_PASSWORD}
    18. hikari:
    19. idle-timeout: 60000
    20. connection-timeout: 60000
    21. validation-timeout: 3000
    22. login-timeout: 5
    23. max-lifetime: 60000
    24. maximum-pool-size: 20
    25. package com.yuruo.reco.config;
    26. import org.apache.commons.lang3.StringUtils;
    27. import org.springframework.boot.SpringApplication;
    28. import org.springframework.boot.env.EnvironmentPostProcessor;
    29. import org.springframework.core.env.ConfigurableEnvironment;
    30. import com.yuruo.reco.constant.SecretConstant;
    31. import com.yuruo.reco.dto.SecretDto;
    32. import com.yuruo.reco.utils.JsonUtils;
    33. import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
    34. import software.amazon.awssdk.regions.Region;
    35. import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient;
    36. import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest;
    37. public class SecretsManagerEnvironmentPostProcessor implements EnvironmentPostProcessor {
    38. @Override
    39. public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
    40. Region region = Region.of(SecretConstant.SECRET_REGION);
    41. SecretsManagerClient client = SecretsManagerClient.builder().region(region).credentialsProvider(DefaultCredentialsProvider.create()).build();
    42. String primarySecret = getSecretRes(client, SecretConstant.SECRET_PRIMARY);
    43. if(StringUtils.isNotBlank(primarySecret)) {
    44. SecretDto secret = JsonUtils.stringToJavaObject(primarySecret, SecretDto.class);
    45. System.setProperty("DB1_USETRNAME", secret.getUsername());
    46. System.setProperty("DB1_PASSWORD", secret.getPassword());
    47. }
    48. String secondarySecret = getSecretRes(client, SecretConstant.SECRET_SECONDARY);
    49. if(StringUtils.isNotBlank(secondarySecret)) {
    50. SecretDto secret = JsonUtils.stringToJavaObject(secondarySecret, SecretDto.class);
    51. System.setProperty("DB2_USETRNAME", secret.getUsername());
    52. System.setProperty("DB2_PASSWORD", secret.getPassword());
    53. }
    54. String mongosecret = getSecretRes(client, SecretConstant.SECRET_MONGO);
    55. if(StringUtils.isNotBlank(mongosecret)) {
    56. SecretDto secret = JsonUtils.stringToJavaObject(mongosecret, SecretDto.class);
    57. System.setProperty("MGDB_URI", "mongodb://"+secret.getUsername()+":"+secret.getPassword()+"@"+ secret.getHost()+":"+secret.getPort()+"/?replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false");
    58. }
    59. }
    60. private String getSecretRes(SecretsManagerClient client, String secretName) {
    61. GetSecretValueRequest request = GetSecretValueRequest.builder().secretId(secretName).build();
    62. return client.getSecretValue(request).secretString();
    63. }
    64. }

  • 相关阅读:
    利用Flutter的特性最大程度提升iOS应用的用户体验
    设置centos系统语言设置为中文
    EasySwipeMenuLayout - 独立的侧滑删除
    如何应对网络攻击?
    (附源码)ssm招聘网站 毕业设计 250858
    c++ vs2019 cpp20规范的STL库的map与multimap源码分析
    客户开发信怎么写?新手如何发客户开发信?
    短视频被替代的趋势-今抖云创
    微服务 BFF 架构设计
    制造商面临的常见网络威胁是什么,他们如何保护自己
  • 原文地址:https://blog.csdn.net/weixin_38285470/article/details/136397894