Framework/Spring

[Error]Spring Security authenticate 302

SHXL2 2024. 9. 2. 10:44
반응형

최근 Spring Security 설정을 하며 발견한 오류 입니다.

해당 오류는 Spring Security의 AuthenticationProvider를 구현하며 메소드를 Overried하여 그대로 사용하는 경우 발생할 수 있습니다.

 

 

AuthenticationProvider에는 authenticate, supports 두 메소드가 존재합니다.

인터페이스 상속 후 자동으로 Overried를 하게 되면 supports 메소드의 리터값은 false로 고정되어 있습니다. 

public interface AuthenticationProvider {

	/**
	 * Performs authentication with the same contract as
	 * {@link org.springframework.security.authentication.AuthenticationManager#authenticate(Authentication)}
	 * .
	 * @param authentication the authentication request object.
	 * @return a fully authenticated object including credentials. May return
	 * <code>null</code> if the <code>AuthenticationProvider</code> is unable to support
	 * authentication of the passed <code>Authentication</code> object. In such a case,
	 * the next <code>AuthenticationProvider</code> that supports the presented
	 * <code>Authentication</code> class will be tried.
	 * @throws AuthenticationException if authentication fails.
	 */
	Authentication authenticate(Authentication authentication) throws AuthenticationException;

	/**
	 * Returns <code>true</code> if this <Code>AuthenticationProvider</code> supports the
	 * indicated <Code>Authentication</code> object.
	 * <p>
	 * Returning <code>true</code> does not guarantee an
	 * <code>AuthenticationProvider</code> will be able to authenticate the presented
	 * instance of the <code>Authentication</code> class. It simply indicates it can
	 * support closer evaluation of it. An <code>AuthenticationProvider</code> can still
	 * return <code>null</code> from the {@link #authenticate(Authentication)} method to
	 * indicate another <code>AuthenticationProvider</code> should be tried.
	 * </p>
	 * <p>
	 * Selection of an <code>AuthenticationProvider</code> capable of performing
	 * authentication is conducted at runtime the <code>ProviderManager</code>.
	 * </p>
	 * @param authentication
	 * @return <code>true</code> if the implementation can more closely evaluate the
	 * <code>Authentication</code> class presented
	 */
	boolean supports(Class<?> authentication);

}

 


 supports 메소드는 해당 Provider가 특정 Authentication 객체 타입을 처리할 수 있는지 여부를 결정하는 역할을 합니다.

오류가 발생한 코드는 다음과 같습니다.

@Override
public boolean supports(Class<?> authentication) {
    return false;
}

 

Spring Security는 인증 요청이 들어올 때, AuthenticationManager를 통해 등록된 여러 AuthenticaitonProvider를 차례로 호출하면서 supports 메소드를 통해 해당 Provider가 요청된 인증 타입을 처리할 수 있는지를 확인합니다. 따라서 false를 고정으로 반환하는 경우 Provider는 Authentication 객체를 처리하지 않게 되고, 로그인 처리시에 항상 302 오류를 반환하게 됩니다.

 

일반적으로 로그인 폼을 사용하게 된다면 UsernamePasswordAuthenticationFilter에서 인증 처리를 하게 됩니다. 이후 인증 객체를 UsernamePasswordAuthenticationToken로 생성하여 반환합니다.

 

때문에 supports 메소드에 UsernamePasswordAuthenticationToken을 인증 처리 대상으로 삼을 수 있도록 아래와 같이 코드를 수정합니다.

@Override
public boolean supports(Class<?> authentication) {
    return authentication.equals(UsernamePasswordAuthenticationToken.class);
}

 

 

반응형