복붙노트

[SPRING] 봄 보안 사용자 정의 AuthenticationException 메시지

SPRING

봄 보안 사용자 정의 AuthenticationException 메시지

안녕 내가 봄 보안 로그인 양식에 새로운 예외를 추가 할 필요가 완벽하게 모든 것을 제외하고 나는 내 자신의 오류 메시지 (지금까지 "잘못된 로그인 / 비밀 번호"하나)를 표시하고 싶지.

사용자 이름 암호 인증 필터에서 기본 시도 인증 방법을 다시 정의했습니다.

@Override
public Authentication attemptAuthentication(final HttpServletRequest request, final HttpServletResponse response)
{
if (!myTest()) {
throw new CustomAuthenticationException("custom message");
}
}

내 예외 :

public class CustomAuthenticationException extends AuthenticationException {

    public CustomAuthenticationException(final String message)
    {
        super(message);
    }

    public CustomAuthenticationException(final String message, final Throwable cause)
    {
        super(message, cause);
    }

}

내 컨트롤러에서 내 예외를 SPRING_SECURITY_LAST_EXCEPTION에서 볼 수 있지만 오류 메시지는 항상 나쁜 자격 증명에서 하나, 어떻게 변경할 수 있습니까?

고맙습니다

해결법

  1. ==============================

    1.LOCALIZING SPRING SECURITY MESSAGE를 시도해야합니다. 이 줄을 ApplicationContext.xml 파일에 추가해보십시오. 나머지 봄 보안 콩은 어디 있습니다.

    LOCALIZING SPRING SECURITY MESSAGE를 시도해야합니다. 이 줄을 ApplicationContext.xml 파일에 추가해보십시오. 나머지 봄 보안 콩은 어디 있습니다.

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="yourFolder/myMessages"/>
    </bean>
    

    가 저장된 스프링 기본 클래스를 찾아야합니다. myMessage 파일을 동일한 KEY 및 현지화 된 메시지로 사용하십시오. 귀하의 의견을 바탕으로, 귀하의 프로젝트에 messages.properties 있습니다. 따라서이 속성 파일 내에있는 각 키에 대해 메시지를 가지고 완전히 현지화 된 메시지를 갖기 만하면됩니다.

    AbstractAccessDecisionManager.accessDenied= your message in any language
    AbstractSecurityInterceptor.authenticationNotFound=
    AbstractUserDetailsAuthenticationProvider.badCredentials=
    AbstractUserDetailsAuthenticationProvider.credentialsExpired=
    AbstractUserDetailsAuthenticationProvider.disabled=
    AbstractUserDetailsAuthenticationProvider.expired=
    AbstractUserDetailsAuthenticationProvider.locked=
    AbstractUserDetailsAuthenticationProvider.onlySupports=
    AccountStatusUserDetailsChecker.credentialsExpired=
    AccountStatusUserDetailsChecker.disabled=
    AccountStatusUserDetailsChecker.expired=
    AccountStatusUserDetailsChecker.locked=
    AclEntryAfterInvocationProvider.noPermission=
    AnonymousAuthenticationProvider.incorrectKey=
    BindAuthenticator.badCredentials=
    BindAuthenticator.emptyPassword=
    CasAuthenticationProvider.incorrectKey=
    CasAuthenticationProvider.noServiceTicket=
    ConcurrentSessionControlStrategy.exceededAllowed=
    DigestAuthenticationFilter.incorrectRealm=
    DigestAuthenticationFilter.incorrectResponse=
    DigestAuthenticationFilter.missingAuth=
    DigestAuthenticationFilter.missingMandatory=
    DigestAuthenticationFilter.nonceCompromised=
    DigestAuthenticationFilter.nonceEncoding=
    DigestAuthenticationFilter.nonceExpired=
    DigestAuthenticationFilter.nonceNotNumeric=
    DigestAuthenticationFilter.nonceNotTwoTokens=
    DigestAuthenticationFilter.usernameNotFound=
    JdbcDaoImpl.noAuthority=
    JdbcDaoImpl.notFound=
    LdapAuthenticationProvider.badCredentials=
    LdapAuthenticationProvider.credentialsExpired=
    LdapAuthenticationProvider.disabled=
    LdapAuthenticationProvider.expired=
    LdapAuthenticationProvider.locked=
    LdapAuthenticationProvider.emptyUsername=
    LdapAuthenticationProvider.onlySupports=
    PasswordComparisonAuthenticator.badCredentials=
    PersistentTokenBasedRememberMeServices.cookieStolen=
    ProviderManager.providerNotFound=
    RememberMeAuthenticationProvider.incorrectKey=
    RunAsImplAuthenticationProvider.incorrectKey=
    SubjectDnX509PrincipalExtractor.noMatching=
    SwitchUserFilter.noCurrentUser=
    SwitchUserFilter.noOriginalAuthentication=
    
  2. ==============================

    2.messages.properties (또는 이름을 지정한 이름)에 다음과 같은 행을 추가하십시오.

    messages.properties (또는 이름을 지정한 이름)에 다음과 같은 행을 추가하십시오.

    AbstractUserDetailsAuthenticationProvider.badCredentials=The credentials you supplied are invalid.
    

    사용자 정의 AuthenticationException은 필요하지 않습니다.

  3. ==============================

    3.loginMessage.properties와 같은 클래스 경로에 특성 파일을 작성하십시오.

    loginMessage.properties와 같은 클래스 경로에 특성 파일을 작성하십시오.

    해당 특성 파일에서 다음을 지정하십시오.

    AbstractUserDetailsAuthenticationProvider.badCredentials = 사용자 이름 / 암호를 잘못 입력했습니다.

    applicationContext.xml에 다음 bean을 추가하십시오.

    <bean id="messageSource"   
        class="org.springframework.context.support.ResourceBundleMessageSource">  
        <property name="basenames">  
            <list>
                <value>loginMessage</value>
            </list>
        </property>
    </bean>
    

    그 후에, Username / Password와 같은 메시지가 잘못 입력됩니다. 잘못된 자격 증명 대신

  4. ==============================

    4.매우 간단한 방법은 다음과 같이 예외 처리기 (@ControllerAdvice)에서 사용자 지정 메시지를 정의하는 것입니다.

    매우 간단한 방법은 다음과 같이 예외 처리기 (@ControllerAdvice)에서 사용자 지정 메시지를 정의하는 것입니다.

    @ResponseStatus(HttpStatus.UNAUTHORIZED)
    @ResponseBody
    @ExceptionHandler(value = AuthenticationException.class)
    public ResponseModal handleAuthenticationExceptions(AuthenticationException ex, HttpServletResponse response) {
        LOGGER.info("Authentication Exception: {}", ex.getMessage());
        response.addCookie(new Cookie(JWTConfigurer.JWT_TOKEN_COOKIE, null));
        return new ResponseModal(HttpStatus.UNAUTHORIZED.value(), "whatever you want");
    }
    
  5. from https://stackoverflow.com/questions/16759264/spring-security-custom-authenticationexception-message by cc-by-sa and MIT license