2012-03-22 6 views
6

Shiro의 SecurityUtils.getSubject()이 작동하는 것을 이해하는 기본적인 방법은 현재 실행중인 스레드에 바인딩 된 제목을 반환한다는 것입니다. 그러나 이것은 요청을 처리하기 위해 스레드 풀을 사용하는 Tomcat과 같은 서블릿 컨테이너와는 다소 차이가 있습니다.다중 스레드 환경에서 Shiro

Tomcat이 ThreadA를 사용하여 요청을 처리한다고 말하면 SecurityUtils.getSubject()을 호출하면 정상적으로 작동합니다. 그러나 ThreadB가 선택 되 자마자 사용자는 손실되고 getSubject은 null을 반환하고 isAuthenticated는 이제 false입니다. 사용자가 아직 로그인되어 있어도 마찬가지입니다.

본인의 애플리케이션에서이를 확인했습니다. 나는 Shiro Core 1.2를 사용하고 있는데, 내 앱을 탐색 할 때 내 사용자가 단지 기적적으로 인증을받지 못한다는 것을 알 수 있습니다. 로그를 보면 다른 스레드가 요청을 처리하는 즉시 문제가 발생합니다.

그래서 Shiro가 잘못 구성 되었습니까? '현재 사용자'가 현재 스레드보다 좀 더 오랫동안 지속되어야하는 것처럼 보입니다. 세션 기반이 될 것으로 기대합니다. 나는 Shiro가 세션 관리 기능을 가지고 있지만, 발견 한 모든 예제에서 ThreadContext를 보는 getSubject을 호출하여 현재 사용자를 얻는다 고 말합니다. 내가 놓친 게 있니?

답변

12

그래서 시로가 제대로 구성되지 않았 음이 밝혀졌습니다. 나는 웹 응용 프로그램을 가지고 있지만 보안 관리자를 코드로 설정하고있었습니다. 이로 인해 보안 관리자가 특정 스레드에서만 설정되었습니다. 동일한 스레드가 요청을 처리하는 한 정상적으로 작동합니다. 그러나 Tomcat이 다른 스레드를 선택하자마자 사용자는 인증되지 않은 것처럼 보였습니다.

Shiro는이 시나리오를 처리하고 들어오는 각 요청에 사용자를 바인딩하는 웹 앱용 필터를 제공합니다. 코드에서 보안 관리자를 수행하는 대신 앱을 다음과 같이 구성해야합니다.

<context-param> 
    <param-name>shiroConfigLocations</param-name> 
    <param-value>classpath:auth.ini</param-value> 
</context-param> 

<!-- Shiro Environment Listener --> 
<listener> 
    <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> 
</listener> 

<!-- Shiro Filter Configuration --> 
<filter> 
    <filter-name>ShiroFilter</filter-name> 
    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>ShiroFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
+0

감사합니다. 답장을 보내 주셔서 감사합니다. –

+0

'SecurityUtils.getSubject()'에 대해 몇 가지 질문이 있습니다. Tomcat 컨테이너에 스레드 풀이 있기 때문에 하나의 스레드가 다중 주제에 바운드 될 수 있습니까? – znlyj

관련 문제