具有嵌入式Active MQ的Spring Boot丢失了安全上下文

问题描述

我有一个带有嵌入式Active MQ的Spring Boot应用程序,但是在@JmsListener中,我需要使用SecurityContextHolder.getContext()之类的Spring Security期货。但是由于请求来自MQ服务器,因此安全上下文丢失了。对于独立的MQ服务器,这是合理的行为,但是对于嵌入式服务器,我想继续使用从原始HTTP请求生成的安全上下文。

我可以配置Spring JMS和嵌入式Active MQ来从生产者到消费者抛出安全上下文吗?

我当前的配置:

@EnableJms
@Configuration
public class JmsConfig {

    public static final String ORDER_CREATE = "order-create";

    @Bean
    public JmsListenerContainerFactory<?> jmsFactory(ConnectionFactory connectionFactory,DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        configurer.configure(factory,connectionFactory);
        return factory;
    }

    @Bean
    public MessageConverter jacksonJmsMessageConverter() {
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        converter.settargettype(MessageType.TEXT);
        converter.setTypeIdPropertyName("_type");
        return converter;
    }

}

JMS方法

@SneakyThrows
public Long sendCreateOrder(@NotNull Order order) {
    Message receivedMsg = jmstemplate.sendAndReceive(JmsConfig.ORDER_CREATE,session -> {
        try {
            Message orderMsg = session.createTextMessage(objectMapper.writeValueAsstring(order));
            orderMsg.setStringProperty("_type","pro.laplacelab.domain.Order");
            return orderMsg;
        } catch (JsonProcessingException e) {
            throw new JMSException("JMS order create is Failed.");
        }
    });

    assert receivedMsg != null;
    return objectMapper.readValue(((ActiveMQTextMessage) receivedMsg).getText(),Long.class);
}

@SneakyThrows
@JmsListener(destination = JmsConfig.ORDER_CREATE,containerFactory = "jmsFactory")
public void receiveOrder(@Payload Order order,Message message) {
    Long id = create(order); // create method is complicated logic which use security context
    jmstemplate.convertAndSend(message.getJMSReplyTo(),id);
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)