Интеграция с Apache Shiro и Netty ExecutionHandler / OrderedMemoryAwareThreadPoolExecutor - PullRequest
6 голосов
/ 28 марта 2012

Я только что добавил ExecutionHandler в свой конвейер сервера непосредственно перед моим основным обработчиком бизнес-логики, как рекомендовано в документации.

Я использую Apache Shiro http://shiro.apache.org/ для безопасности. Он работал нормально, пока я не добавил ExecutionHandler.

Вопрос :
Контекст выполнения Широ связан с текущим потоком, в котором вы получаете объект Subject. Таким образом, если Subject получено в рабочем потоке, но бизнес-логика выполняется в отдельном управляемом потоке ExecutionHandler, тогда два контекста выполнения не будут связаны, насколько это касается Широ. Таким образом, Широ в потоке ExecutionHandler не сможет понять, что Subject действительно аутентифицирован. Итак, я получаю ошибки аутентификации.

Можно связать данный Subject с Runnable перед передачей его Executor.execute(), чтобы сохранить контекст безопасности. Смотри: http://shiro.apache.org/subject.html

Исходя из этого, я думаю, что нужно найти способ связать текущий Shiro Subject с ExecutionHandler Runnable.

Я все еще пытаюсь полностью понять реализации ExecutionHandler и OrderedMemoryAwareThreadPoolExecutor.

В основном мне нужно позвонить subject.associateWith(aRunnable) непосредственно перед тем, как aRunnable будет передано Executor.execute(aRunnable).

У кого-нибудь есть мысли о том, где / как я мог бы подключить Широ к миксу?

Спасибо, Matt

1 Ответ

14 голосов
/ 28 марта 2012

Широ может автоматизировать передачу сообщений для вас.

Вы можете просто использовать одну из SubjectAwareExecutor , SubjectAwareExecutorService или SubjectAwareScheduledExecutorService из коробки. Вы можете обернуть реальный ExecutorService, который будет выполнять Runnables, и вы в порядке. Например:

ExecutorService myExistingExecutorService = //get from somewhere
ExecutorService useThis = new SubjectAwareExecutorService(myExistingExecutorService);

Вы можете «внедрить» или настроить экземпляр useThis в любом месте вашего приложения, и вызывающему коду не нужно знать, что Широ существует.

Например, неизвестный компонент, вызывающий useThis.submit(someRandomRunnable), не подозревает, что Shiro используется, но тема Shiro все равно будет сохраняться в разных потоках. Проверьте соответствующие страницы JavaDoc для получения дополнительной информации.

НТН!

Les

...