2012-03-28 8 views
6

Właśnie dodałem do mojego serwera potok ExecutionHandler tuż przed moim głównym programem do obsługi logiki biznesowej, zgodnie z zaleceniami w dokumentacji.Integracja Apache Shiro i Netty ExecutionHandler/OrderedMemoryAwareThreadPoolExecutor

Używam Apache Shiro http://shiro.apache.org/ dla bezpieczeństwa. Wszystko działało dobrze, dopóki nie dodałem ExecutionHandler.

Kwestia: kontekst wykonanie
Shiro jest zobowiązany do bieżącego wątku, w którym można uzyskać obiekt Subject. Tak więc, jeśli Subject jest uzyskiwany w wątku roboczym, ale logika biznesowa jest wykonywana w osobnym wątku zarządzanym ExecutionHandler, wówczas dwa konteksty wykonania nie zostaną połączone, jeśli chodzi o Shiro. W związku z tym Shiro w wątku ExecutionHandler nie zdaje sobie sprawy, że Subject jest rzeczywiście uwierzytelniony. Dostaję więc błędy uwierzytelnienia.

Możliwe jest skojarzenie danego Subject z Runnable przed przekazaniem go do Executor.execute(), aby zachować kontekst zabezpieczeń. Zobacz: http://shiro.apache.org/subject.html

Na tej podstawie myślę, trzeba znaleźć sposób, aby skojarzyć aktualny Shiro Subject z ExecutionHandlerRunnable.

Nadal staram się w pełni zrozumieć implementacje ExecutionHandler i OrderedMemoryAwareThreadPoolExecutor.

Zasadniczo muszę zadzwonić pod numer subject.associateWith(aRunnable) tuż przed aRunnable został przekazany do Executor.execute(aRunnable).

Czy ktoś ma przemyślenia na temat tego, gdzie/w jaki sposób mogę podłączyć Shiro do miksu?

Dzięki Matt

+2

Byłoby interesujące zobaczyć, jak zintegrowałeś shiro i Netty. Jeśli jest to opensource, czy mógłbyś udostępnić link? Może wkleić go jako istotę github. – Abe

Odpowiedz

14

Shiro można zautomatyzować handoffs wątku dla Ciebie.

Powinieneś być w stanie użyć jednej z implementacji SubjectAwareExecutor, SubjectAwareExecutorService lub SubjectAwareScheduledExecutorService po wyjęciu z pudełka. Możesz zawinąć rzeczywistą ExecutorService, która wykona Runnables, i jesteś dobry. Na przykład:

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

można „wstrzyknąć” lub skonfigurować instancję useThis gdziekolwiek w aplikacji i kod wywołujący nie zawsze trzeba wiedzieć Shiro istnieje.

Na przykład nieświadomy składnik wywołujący useThis.submit(someRandomRunnable) nie ma pojęcia, że ​​Shiro jest w użyciu, ale obiekt Shiro będzie nadal zachowany w wątkach. Sprawdź odpowiednie strony JavaDoc, aby uzyskać więcej informacji.

HTH!

Les

+1

Podłączyłem 'SubjectAwareExecutorService' w moim kontekście aplikacji i wszystko działa teraz bardzo dobrze. Wielkie dzięki za to. Właśnie tego szukałem. Pozdrawiam, Matt –