2012-03-28 1 views
6

Я просто добавил ExecutionHandler к моему серверному конвейеру непосредственно перед моим основным обработчиком бизнес-логики, как это рекомендовано в документации.Интеграция Apache Shiro и Netty ExecutionHandler/OrderedMemoryAwareThreadPoolExecutor

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

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

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

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

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

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

Есть ли у кого-нибудь мысли о том, где/как я мог забрать Сиро в микс?

Спасибо, Matt

+2

Было бы интересно посмотреть, как вы интегрировали shiro и Netty. Если это open source, вы можете поделиться ссылкой? Возможно, вставьте его как github gist. – Abe

ответ

14

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

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

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

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

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

HTH!

Les

+1

Я подключил 'SubjectAwareExecutorService' в моем контексте приложения, и теперь все работает очень хорошо. Большое спасибо за это. Это именно то, что я искал. Привет, Мэтт –