Проблема состоит в том, что безопасность Spring не делает объекта Аутентификации доступным как боб в контейнере, таким образом, нет никакого способа легко ввести или автосоединить его проводом из поля.
, Прежде чем мы начали использовать безопасность Spring, мы создадим ограниченный по объему сессией боб в контейнере, чтобы сохранить Принципал, ввести это в "AuthenticationService" (одиночный элемент) и затем ввести этот боб на другие службы, для которых было нужно знание текущего Принципала.
при реализации собственной услуги аутентификации Вы могли бы в основном сделать то же самое: создайте ограниченный по объему сессией боб с "основным" свойством, введите это в свою услугу аутентификации, сделайте, чтобы подлинный сервис установил свойство на успешном авторе и затем сделайте подлинный сервис доступным для других бобов, поскольку Вам нужен он.
я не чувствовал бы себя слишком плохо об использовании SecurityContextHolder. все же. Я знаю, что это - помехи / Singleton и что Spring препятствует использованию таких вещей, но их реализация заботится для поведения соответственно в зависимости от среды: ограниченный по объему сессией в контейнере Сервлета, ограниченном по объему потоком в тесте JUnit, и т.д. Реальный ограничивающий фактор Singleton - когда он обеспечивает реализацию, которая негибка к различным средам.
Просто выбросьте это - вашему демону должна потребоваться среда rails, с которой вы работаете. Он должен выглядеть примерно так:
RAILS_ENV = ARGV.first || ENV['RAILS_ENV'] || 'production'
require File.join('config', 'environment')
Таким образом вы можете указать среду, в которой вызывается демон.
Поскольку он запускает отложенное задание, скорее всего, демон уже это делает (ему нужна активная запись), но, возможно, вы только требуется минимальная активная запись для выполнения delayed_job без рельсов.
Hoptoad использует метод перехвата Rails rescue_action_in_public
для перехвата исключений и их регистрации. Этот метод выполняется только тогда, когда запрос отправляется контроллером Rails.
По этой причине Hoptoad полностью не осведомлен о каких-либо исключениях, созданных, например, задачами rake или сценарием / runner rails.
Если вы хотите, чтобы Hoptoad отслеживал ваше исключение, вы должны вручную интегрировать его. Это должно быть довольно просто. Следующий фрагмент кода демонстрирует, как вызывается Hoptoad
def rescue_action_in_public_with_hoptoad exception
notify_hoptoad(exception) unless ignore?(exception) || ignore_user_agent?
rescue_action_in_public_without_hoptoad(exception)
end
Просто включите библиотеку Hoptoad в свою среду и вызов notify_hoptoad (исключение)
должен работать. Убедитесь, что ваша среда предоставляет тот же API, что и контроллер Rails, иначе Hoptoad может пожаловаться.
Проверьте исходный код Delayed :: Job ... там есть фрагмент вроде:
# This is a good hook if you need to report job processing errors in additional or different ways
def log_exception(error)
logger.error "* [JOB] #{name} failed with #{error.class.name}: #{error.message} - #{attempts} failed attempts"
logger.error(error)
end
Я не пробовал, но думаю, вы могли бы сделать что-то вроде:
class Delayed::Job
def log_exception_with_hoptoad(error)
log_exception_without_hoptoad(error)
HoptoadNotifier.notify(error)
end
alias_method_chain :log_exception, :hoptoad
end