2016-06-27 7 views
1

私はJWTを使用して認証するためのスプリングベースのサービスに取り組んでいます。Spring Securityは複数のスレッド間でコンテキストを共有しますが、どうすればこの問題を回避できますか?

ユーザーの要求を処理するサービスは、セキュリティコンテキストを設定し、かなりこのように見えるフィルターに認可サービスを呼び出します。

@Component 
public class TokenAuthenticationFilter extends OncePerRequestFilter { 

    private final Logger log = LoggerFactory.getLogger(this.getClass()); 

    @Autowired 
    private AuthorizationServiceClient authorizationServiceClient; 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { 
     try { 
      User user = authorizationServiceClient.requestUserFromToken(request.getHeader("X-Auth-Token")); 
      SecurityContextHolder.getContext().setAuthentication(new UserAuthentication(user)); 
      filterChain.doFilter(request, response); 
      SecurityContextHolder.getContext().setAuthentication(null); 
     } catch (HttpClientErrorException e) { 
      response.sendError(e.getStatusCode().value()); 
     } 
    } 
} 

AuthorizationServiceClientは、ユーザーのの検証を処理リモートサービスを呼び出します役割と資格情報

私は非常に奇妙な行動に直面しています

私のUI上のページには、同時に複数の要求を作っていたとき、私は500を取得してしまう、NullPointerExceptionが発生によって引き起こされます。

根本的な原因は、ユーザーが持っているプリンシパル(ユーザーのIDを含む)がnullである場合です。

答えて

1

厄介な調査の後、SecurityContextHolderは、ThreadLocalを使用していてもセッションを使用していて、スレッド間で共有されていることがわかりました。

SecurityContextHolder.getContext().setAuthentication(null);は、同じセッションで要求が発生したときに同時スレッドで使用された値を消去し、NPEにつながっていました。

私のように、あなたがセッションの使用を防止したいのであれば、あなたは使用してセキュリティを設定する必要があります。

http. 
    [...] 
    .sessionManagement() 
    .sessionCreationPolicy(SessionCreationPolicy.STATELESS). 
    [...] 
関連する問題