Интеграция с Apache Shiro и Netty ExecutionHandler/OrderedMemoryAwareThreadPoolExecutor

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

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

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

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

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

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

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

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

Спасибо, Мэтт


person Matt Friedman    schedule 28.03.2012    source источник
comment
Было бы интересно посмотреть, как вы объединили Широ и Нетти. Если это с открытым исходным кодом, не могли бы вы поделиться ссылкой? Возможно, вставьте его как суть github.   -  person Abe    schedule 14.05.2012


Ответы (1)


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

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

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

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

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

ХТХ!

Лес

person Les Hazlewood    schedule 28.03.2012
comment
Я подключил SubjectAwareExecutorService в контексте своего приложения, и теперь все работает очень хорошо. Большое спасибо за это. Это именно то, что я искал. Привет, Мэтт - person Matt Friedman; 28.03.2012