2012-03-28 2 views
6

문서에서 권장하는대로 주 비즈니스 논리 처리기 바로 앞에 서버 파이프 라인에 ExecutionHandler을 추가했습니다.Apache Shiro 통합 및 Netty ExecutionHandler/OrderedMemoryAwareThreadPoolExecutor

보안을 위해 Apache Shiro http://shiro.apache.org/을 사용하고 있습니다. ExecutionHandler을 추가 할 때까지 제대로 작동했습니다.

문제 :
시로의 실행 컨텍스트가 당신이 Subject 오브젝트를 취득하는 현재 스레드에 바인딩됩니다. 따라서 작업자 스레드에서 Subject을 얻었지만 비즈니스 논리를 별도의 ExecutionHandler 관리 스레드에서 실행하면 Shiro와 관련하여 두 실행 컨텍스트가 연결되지 않습니다. 따라서 Shiro는 ExecutionHandler 스레드에서 Subject이 실제로 인증되었음을 인식하지 못합니다. 인증 오류가 발생했습니다.

주어진 을 Runnable으로 연결 한 후 Executor.execute()으로 전달하여 보안 컨텍스트가 유지되도록 할 수 있습니다. 참조 : http://shiro.apache.org/subject.html

을 바탕으로 내가 생각하는이가 ExecutionHandlerRunnable와 현재 시로 Subject을 연결하는 방법을 찾을 필요에.

ExecutionHandlerOrderedMemoryAwareThreadPoolExecutor 구현을 완전히 이해하려고합니다.

기본적으로 aRunnableExecutor.execute(aRunnable)으로 전달되기 전에 subject.associateWith(aRunnable)으로 전화해야합니다.

누구나 Shiro를 믹스에 연결할 수있는 곳/방법에 대한 생각이 있습니까?

감사합니다, 매트

+2

shiro와 Netty를 어떻게 통합했는지 살펴 보는 것은 흥미로울 것입니다. 그것이 opensource라면 링크를 공유 할 수 있습니까? 어쩌면 그것을 github 요지로 붙일 수 있습니다. – Abe

답변

14

시로 당신을위한 스레드 핸드 오프를 자동화 할 수 있습니다.

SubjectAwareExecutor, SubjectAwareExecutorService 또는 SubjectAwareScheduledExecutorService 구현 중 하나만 사용 가능해야합니다. Runnables를 실행할 실제 ExecutorService를 래핑 할 수 있습니다. 예를 들어 :

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

당신은 '삽입'하거나 응용 프로그램에서 어디서나 useThis 인스턴스를 구성하고 호출 코드는 지금까지 시로가 존재 알 필요가 없습니다.

예를 들어 useThis.submit(someRandomRunnable)을 호출하는 인식되지 않는 구성 요소는 Shiro가 사용 중이라는 것을 알지 못하지만 Shiro 제목은 여전히 ​​스레드간에 유지됩니다. 각 JavaDoc 페이지를 확인하십시오.

HTH!

+1

내 응용 프로그램 컨텍스트에서'SubjectAwareExecutorService'를 연결했는데 모든 것이 잘 작동합니다. 이것에 대해 많은 감사드립니다. 그것은 내가 찾고 있었던 바로 그 것이다. 건배, 매트 –

관련 문제