현재 버전

행복하자!! 

다시 한 번 강조드리자면.. 시큐리티 필터는 인증 오류를 던지지 않습니다. 메서드를 혼동하신 것 같습니다. UsernamePasswordAuthenticationProcessingFilter.attemptAuthentication 에서는 AuthenticationException을 던지고 있으나, 이 메서드를 실행하는 AbstractAuthenticationProcessingFilter에서는 AuthenticationException을 처리하는 로직을 확인할 수 있습니다.

	private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		if (!requiresAuthentication(request, response)) {
			chain.doFilter(request, response);
			return;
		}
		try {
			Authentication authenticationResult = attemptAuthentication(request, response);
			if (authenticationResult == null) {
				// return immediately as subclass has indicated that it hasn't completed
				return;
			}
			this.sessionStrategy.onAuthentication(authenticationResult, request, response);
			// Authentication success
			if (this.continueChainBeforeSuccessfulAuthentication) {
				chain.doFilter(request, response);
			}
			successfulAuthentication(request, response, chain, authenticationResult);
		}
		catch (InternalAuthenticationServiceException failed) {
			this.logger.error("An internal error occurred while trying to authenticate the user.", failed);
			unsuccessfulAuthentication(request, response, failed);
		}
                // 이 곳
		catch (AuthenticationException ex) {
			// Authentication failed
			unsuccessfulAuthentication(request, response, ex);
		}
	}

UsernamePasswordAuthenticationProcessingFilter를 대표적으로 예를 들었지만 다른 시큐리티 필터 모두 AuthenticationException이 발생하는 경우, handler를 통해 자체 핸들링합니다. 절대 ServletContainer로 노출시키는 일은 없습니다.


수정 이력

2022-03-07 10:18:17 에 아래 내용에서 변경 됨 #3

행복하자!! 

다시 한 번 강조드리자면.. 시큐리티 필터는 인증 오류를 던지지 않습니다. 메서드를 혼동하신 것 같습니다. UsernamePasswordAuthenticationProcessingFilter.attemptAuthentication 에서는 AuthenticationException을 던지고 있으나, 이 메서드를 실행하는 AbstractAuthenticationProcessingFilter에서는 AuthenticationException을 처리하는 로직을 확인할 수 있습니다.

	private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		if (!requiresAuthentication(request, response)) {
			chain.doFilter(request, response);
			return;
		}
		try {
			Authentication authenticationResult = attemptAuthentication(request, response);
			if (authenticationResult == null) {
				// return immediately as subclass has indicated that it hasn't completed
				return;
			}
			this.sessionStrategy.onAuthentication(authenticationResult, request, response);
			// Authentication success
			if (this.continueChainBeforeSuccessfulAuthentication) {
				chain.doFilter(request, response);
			}
			successfulAuthentication(request, response, chain, authenticationResult);
		}
		catch (InternalAuthenticationServiceException failed) {
			this.logger.error("An internal error occurred while trying to authenticate the user.", failed);
			unsuccessfulAuthentication(request, response, failed);
		}
		catch (AuthenticationException ex) {
			// Authentication failed
			unsuccessfulAuthentication(request, response, ex);
		}
	}

UsernamePasswordAuthenticationProcessingFilter를 대표적으로 예를 들었지만 다른 시큐리티 필터 모두 AuthenticationException이 발생하는 경우, handler를 통해 자체 핸들링합니다. 절대 ServletContainer로 노출시키는 일은 없습니다.

2022-03-07 10:17:29 에 아래 내용에서 변경 됨 #2

행복하자!! 

다시 한 번 강조드리자면.. 시큐리티 필터는 인증 오류를 던지지 않습니다. 메서드를 혼동하신 것 같습니다. UsernamePasswordAuthenticationProcessingFilter.attemptAuthentication 에서는 AuthenticationException을 던지고 있으나, 이 메서드를 실행하는 AbstractAuthenticationProcessingFilter에서는 AuthenticationException을 처리하는 로직을 확인할 수 있습니다.

	private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		if (!requiresAuthentication(request, response)) {
			chain.doFilter(request, response);
			return;
		}
		try {
			Authentication authenticationResult = attemptAuthentication(request, response);
			if (authenticationResult == null) {
				// return immediately as subclass has indicated that it hasn't completed
				return;
			}
			this.sessionStrategy.onAuthentication(authenticationResult, request, response);
			// Authentication success
			if (this.continueChainBeforeSuccessfulAuthentication) {
				chain.doFilter(request, response);
			}
			successfulAuthentication(request, response, chain, authenticationResult);
		}
		catch (InternalAuthenticationServiceException failed) {
			this.logger.error("An internal error occurred while trying to authenticate the user.", failed);
			unsuccessfulAuthentication(request, response, failed);
		}
		catch (AuthenticationException ex) {
			// Authentication failed
			unsuccessfulAuthentication(request, response, ex);
		}
	}

UsernamePasswordAuthenticationProcessingFilter를 대표적으로 예를 들었지만 다른 시큐리티 필터 모두 AuthenticationException이 발생하는 경우, handler를 통해 핸들링합니다. 절대 ServletContainer로 노출시키는 일은 없습니다.

2022-03-07 10:16:39 에 아래 내용에서 변경 됨 #1

행복하자!! 

시큐리티 필터는 인증 오류를 던지지 않습니다. 메서드를 혼동하신 것 같습니다. UsernamePasswordAuthenticationProcessingFilter.attemptAuthentication 에서는 AuthenticationException을 던지고 있으나, 이 메서드를 실행하는 AbstractAuthenticationProcessingFilter에서는 AuthenticationException을 처리하는 로직을 확인할 수 있습니다.

	private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		if (!requiresAuthentication(request, response)) {
			chain.doFilter(request, response);
			return;
		}
		try {
			Authentication authenticationResult = attemptAuthentication(request, response);
			if (authenticationResult == null) {
				// return immediately as subclass has indicated that it hasn't completed
				return;
			}
			this.sessionStrategy.onAuthentication(authenticationResult, request, response);
			// Authentication success
			if (this.continueChainBeforeSuccessfulAuthentication) {
				chain.doFilter(request, response);
			}
			successfulAuthentication(request, response, chain, authenticationResult);
		}
		catch (InternalAuthenticationServiceException failed) {
			this.logger.error("An internal error occurred while trying to authenticate the user.", failed);
			unsuccessfulAuthentication(request, response, failed);
		}
		catch (AuthenticationException ex) {
			// Authentication failed
			unsuccessfulAuthentication(request, response, ex);
		}
	}

UsernamePasswordAuthenticationProcessingFilter를 대표적으로 예를 들었지만 다른 시큐리티 필터 모두 AuthenticationException이 발생하는 경우, handler를 통해 핸들링합니다. 절대 ServletContainer로 노출시키는 일은 없습니다.