私はレガシーアプリ(Spring 2.2.5、Spring Security 2.0.8)に取り組んでいます。認証はカスタムの PreAuthenticationProcessingFilter によって実現され、SecurityContext には Authentication オブジェクトが取り込まれます。この認証は、ほとんどの場所で使用できます (直接の SecurityContextHolder 呼び出し、または AccessDecisionManager/AfterInvocationProvider 引数)。ただし、Authentication オブジェクト (SecurityContextHolder によってアクセスされる) が null である場所があります。本当に奇妙なのは、これが単一の Http リクエスト内で発生することです。クラス A は認証オブジェクトを取得し、スタック内で後で呼び出されるクラス B は null を取得します。当然、これは同じスレッド内で発生するため、この問題に対する最も単純な答えは除外されます。スレッドが同じであるにもかかわらず、SecurityContextHolder は異なる SecurityContext オブジェクト (SecurityContext. toString() は異なるメモリアドレスを返します)。重要なのは、これが発生する場所が通常の Spring Bean ではないということです。これはかなりカスタムなモジュール サブシステムであり、カスタム クラス ローダーが関与しています。
問題は、別のスレッドを生成する以外に、SecurityContextHolder が SecurityContext オブジェクトを「失う」原因になる可能性があることです。