2016-06-27 2 views
1

저는 JWT를 인증 용으로 사용하는 스프링 기반 서비스를 연구하고 있습니다.봄 보안 공유 다중 스레드간에 컨텍스트, 어떻게 피할 수 있습니까?

사용자 요청을 처리하는이 서비스는 보안 컨텍스트를 설정하고 다음과 같이 꽤 많이 보이는 필터의 인증 서비스를 호출

@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에 페이지가 동시에 여러 요청을했다, 나는 NullPointerException이 발생 500을 그만 둘.

근본 원인은 없어야 할 때 null 인 사용자 (사용자 ID 포함)입니다.

답변

1

힘든 조사 끝에 SecurityContextHolder가 ThreadLocal을 사용하고 있었지만 세션을 사용하고 있었고 스레드간에 공유된다는 것을 알았습니다.

SecurityContextHolder.getContext().setAuthentication(null);은 같은 세션에서 요청이 이루어 졌을 때 동시 스레드에서 사용되는 값을 지우고 NPE로 연결됩니다. 나처럼, 당신은 세션의 사용을 방지하려는 경우

그래서, 당신은 사용하여 보안을 설정해야합니다

http. 
    [...] 
    .sessionManagement() 
    .sessionCreationPolicy(SessionCreationPolicy.STATELESS). 
    [...]