如何解决具有嵌入式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 举报,一经查实,本站将立刻删除。