问题描述
我有一个带有嵌入式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 (将#修改为@)