ShiroのSecurityUtils.getSubject()
が動作することを理解している基本的なやり方は、現在実行中のスレッドにバインドされているサブジェクトを返すことです。しかし、これはちょうどTomcatのようなサーブレットコンテナではスレッドプールを使用してリクエストを処理しているようです。マルチスレッド環境のShiro
TomcatがThreadAを使用して要求を処理すると言うと、SecurityUtils.getSubject()
への呼び出しは正常に動作するはずです。しかし、ThreadBが選択されると、ユーザーは失われ、getSubject
はnullを返し、isAuthenticatedは現在falseになります。これはユーザーがまだログインしている場合でもあります。
私はこれを私のアプリケーションで確認しました。私はShiro Core 1.2を使用しています。私のアプリをナビゲートすると、私のユーザーはちょうど奇跡的に認証されていません。ログを見ると、要求を処理するために別のスレッドが使用されるとすぐに問題が発生します。
Shiroは正しく設定されていますか? 「現在のユーザー」は、現在のスレッドよりも長く持続するものにバインドする必要があるようです。私はセッションベースであると期待しています。私はShiroにセッション管理があることを知っていますが、私が見つけたすべての例では、ThreadContextを参照するgetSubject
を呼び出して現在のユーザーを取得すると言います。何か不足していますか?
この非常によく書かれた返信を返信いただきありがとうございます! –
私は 'SecurityUtils.getSubject()'に関するいくつかの質問があります。 Tomcatコンテナにはスレッドプールが存在するため、1つのスレッドが複数のサブジェクトにバインドされる可能性があります。 – znlyj