【问题标题】:Spring boot - Set Solace password from codeSpring boot - 从代码中设置 Solace 密码
【发布时间】:2021-11-06 16:52:40
【问题描述】:

我有一个 Spring Boot 应用程序,它使用类似于以下的配置连接到一个慰藉队列。

spring:
  cloud:
    function:
      definition: emitSensorReading
    stream:
      poller:
        fixed-delay: 5000
      bindings:
        emitSensorReading-out-0:
          destination: sensor/temperature/fahrenheit
          binder: local-solace
      binders:
        local-solace:
          type: solace
          environment:
            solace:
              java:
                host: tcp://localhost:55555
                msgVpn: default
                clientUsername: default
                clientPassword: default
                connectRetries: -1
                reconnectRetries: -1

我想通过连接到 API 来读取密码,而不是将其硬编码到 application.yaml 文件中。我有一个将返回密码的 REST 服务。如何设置我的 Spring Boot 应用程序以通过从 REST 服务获取密码来建立安全连接?

【问题讨论】:

    标签: spring spring-boot message-queue spring-cloud-stream solace


    【解决方案1】:

    您需要先初始化 RestTemplate,然后在您的 solace 客户端中 @Autowire 它。然后在 PostConstruct 方法中为 solace 客户端创建一个会话,如下所示

    import java.net.URI;
    
    import javax.annotation.PostConstruct;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.HttpEntity;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpMethod;
    import org.springframework.http.MediaType;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;
    
    import com.solacesystems.jcsmp.JCSMPFactory;
    import com.solacesystems.jcsmp.JCSMPProperties;
    import com.solacesystems.jcsmp.JCSMPSession;
    
    @Service
    public class SolaceClienExample {
    
        @Autowired
        RestTemplate restTemplate;
        
        private JCSMPSession session;
    
    
        JCSMPProperties properties;
    
        @PostConstruct
        public void init() {
            this.properties = getJCSMPProperties();
            log.debug("Solace client instantiated with JCSMPProperties properties {}", this.properties);
            this.session = JCSMPFactory.onlyInstance().createSession(properties);
        }
        
        
         private JCSMPProperties getJCSMPProperties() {
            JCSMPProperties properties = new JCSMPProperties();
            properties.setProperty(JCSMPProperties.HOST, "tcp://localhost:8080"); // host:port
            properties.setProperty(JCSMPProperties.USERNAME, "my-user"); // client-username
            properties.setProperty(JCSMPProperties.VPN_NAME, "solace-vpn"); // message-vpn
            properties.setProperty(JCSMPProperties.PASSWORD, getSolacePassword("my-user")); // client-password
            return properties;
         }
         
         public String getSolacePassword(String user){
             String requestUrl="https://url-for-password-get.com"+"/"+user;
             HttpHeaders requestHeaders = new HttpHeaders();
             requestHeaders.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
             requestHeaders.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);
             HttpEntity<Object> request = new HttpEntity(requestHeaders);
             ResponseEntity<PasswordResponseDto> passwordResponse= restTemplate.exchange(
                    new URI(requestUrl), HttpMethod.GET, request, PasswordResponseDto.class);
             return passwordResponse.getPassword();
         }
    }
    

    【讨论】:

      【解决方案2】:

      在我看来,您正在寻找的是类似于配置服务器的东西。它跨多个应用程序和环境存储和提供配置。这些配置最好在 Git 版本控制下进行版本控制,并且可以在应用程序运行时进行修改。

      更多详情请参考以下文档和示例:

      【讨论】:

      • 感谢分享。我浏览了链接,似乎这个解决方案从服务器读取了所有属性。如果我错了,请纠正我。我只需要从 REST API 和 application.yaml 的其他属性中获取密码。有没有办法做到这一点?
      • 如果在配置服务器提供的版本化配置中您只有密码,那么所有其他属性都将从您的 application.yml 中读取。
      • 谢谢,我可以用这个实现我的要求。但是,有没有其他方法可以在没有这个中间配置服务器的情况下做到这一点。理想情况下,通过我的 Spring Boot 应用程序本身连接到 REST API?
      • 好的,那我帮不了你了。我不知道赛博。对不起。但您可以考虑改用 Config Server。
      • 那么需要使用RestTemplate调用API。查看详情here
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 2013-05-15
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      相关资源
      最近更新 更多