2012-03-22 11 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

私はShiroを正しく設定していないことが判明しました。私はWebアプリケーションを持っていますが、コードでSecurity Managerを設定していました。その結果、Security Managerは特定のスレッドのみに設定されました。要求が同じスレッドによって処理されている限り、正常に動作しました。しかし、Tomcatが別のスレッドを選択するとすぐに、ユーザーは認証されていないように見えました。

Shiroには、このシナリオを処理するWebアプリケーション用のフィルタがあり、ユーザーを各着信要求にバインドします。コード内でセキュリティマネージャを実行する代わりに、アプリケーションを次のように設定する必要があります。

<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コンテナにはスレッドプールが存在するため、1つのスレッドが複数のサブジェクトにバインドされる可能性があります。 – znlyj

関連する問題