Как декодировать строку base64 перед использованием в контексте верблюда?

#apache-camel #base64 #javabeans

Вопрос:

Я использую компонент в своем контексте верблюда с классом org.apache.commons.configuration.Конфигурация базы данных, чтобы получить в качестве ключевого значения свойства, сохраненные в моей базе данных. Итак, значения поступают в base64, и мне нужно расшифровать значения, чтобы использовать их на моих маршрутах. Как я могу это сделать?

Ответ №1:

Например, инструменты Ocp и Kubernetes делают это внутри . Он передается в приложение путем декодирования закодированного текста. Вы все еще можете сделать это в camel. этот пример о шифровании и расшифровке с помощью библиотеки jasypt из книги camel. вы должны реализовать базовую PropertiesParser.class для base64 . Анализатор свойств базовый интерфейс . полный пример https://github.com/camelinaction/camelinaction2/blob/master/chapter14/configuration/src/test/java/camelinaction/SecuringConfigTest.java

 JasyptPropertiesParser jasypt = new JasyptPropertiesParser();
    // and set the master password
    jasypt.setPassword("supersecret");   
    
    // we can avoid keeping the master password in plaintext in the application
    // by referencing a environment variable
    // export CAMEL_ENCRYPTION_PASSWORD=supersecret
    // jasypt.setPassword("sysenv:CAMEL_ENCRYPTION_PASSWORD");
    
    // setup the properties component to use the production file
    PropertiesComponent prop = context.getComponent("properties", PropertiesComponent.class);
    prop.setLocation("classpath:rider-test.properties");

    // and use the jasypt properties parser so we can decrypt values
    prop.setPropertiesParser(jasypt);
    
    return context;
 

Ответ №2:

Вы можете попробовать использовать декодер Base64 из java.util пакета и использовать его с компонентом, функцией обмена или процессором. Используйте Base64.getDecoder() или Base64.getUrlDecoder() для получения декодера, затем используйте декодер для декодирования строки base64 в массив байтов, который затем можно преобразовать в строку с верблюдами .convertBodyTo(String.class) или просто создать новый экземпляр с new String(bytes, StandardCharsets.UTF_8);

 package com.example;

import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Base64.Decoder;

import org.apache.camel.RoutesBuilder;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;

public class Base64tests extends CamelTestSupport {

    @Test
    public void Test() throws Exception {

        MockEndpoint resultMockEndpoint = getMockEndpoint("mock:result");
        resultMockEndpoint.expectedMessageCount(1);
        resultMockEndpoint.message(0).body().isEqualTo("Hello World");

        template.sendBody("direct:decodeBase64", "SGVsbG8gV29ybGQ=");

        resultMockEndpoint.assertIsSatisfied();
    }

    @Override
    protected RoutesBuilder createRouteBuilder() throws Exception {
        
        return new RouteBuilder(){

            @Override
            public void configure() throws Exception {
                
                from("direct:decodeBase64")
                    .routeId("decodeBase64")
                    .bean(new Base64Decoder())
                    .log("${body}")
                    .convertBodyTo(String.class)
                    .to("mock:result");
            }
        };
    }
}

class Base64Decoder{

    public byte[] decode(String encodedValue){

        return Base64.getDecoder().decode(encodedValue);
    }
}
 

Использование функции обмена:

 .setBody().exchange( e -> { 
                            
    String encodedBody = e.getMessage()
        .getBody(String.class);
    
    return  Base64.getDecoder()
        .decode(encodedBody); 
})