У меня есть веб-приложение, которое устанавливает весенний контекст безопасности через пружинный фильтр. Услуги защищены весенними аннотациями на основе ролей пользователей. Это работает.Как распространять весенний контекст безопасности для JMS?
асинхронные задачи выполняются в JMS слушателей (расширить javax.jms.MessageListener). Настройка этих слушателей выполняется с помощью Spring.
Сообщения отправляются из веб-приложения, в это время пользователь аутентифицирован. Мне нужна такая же аутентификация в потоке JMS (пользователь и роли) во время обработки сообщений.
Сегодня это делается путем ввода аутентификации пружины в JMS ObjectMessage:
SecurityContext context = SecurityContextHolder.getContext();
Authentication auth = context.getAuthentication();
... put the auth object in jms message object
Затем внутри слушателя JMS объект аутентификации извлекается и устанавливается в контексте:
SecurityContext context = new SecurityContextImpl();
context.setAuthentication(auth);
SecurityContextHolder.setContext(context);
это работает большую часть времени. Но когда перед обработкой сообщения происходит задержка, сообщение никогда не будет обработано. Я еще не мог определить причину потери этих сообщений, но я не уверен, что способ распространения аутентификации хорош, даже если он работает в custer, когда сообщение обрабатывается на другом сервере.
Это правильный способ распространения проверки подлинности пружин?
С уважением, Микаэль
Я не знаком с весной в этом контексте, но раньше я сталкивался с этой проблемой. Хороший контекст безопасности будет иметь время истечения срока действия, после которого его больше нельзя будет использовать. В общем случае, если доставка сообщения задерживается до истечения срока действия, срок действия службы безопасности истек и сообщение не обрабатывается. Это может быть проблемой здесь, и в этом случае увеличение этого срока истечения может исправить это или, по крайней мере, сделать его менее распространенным. – Alasdair