Programing/Spring Security

spring boot security login error message 한글 설정

리커니 2019. 12. 6. 12:24
반응형

 

spring boot security login error message 한글 설정

 

 

spring boot 프로젝트에 spring security 적용방법은 아래의 link를 참고하세요.

 

 

 

link : https://aljjabaegi.tistory.com/507

 

springboot 2.x + spring security mariadb login 구현 WebSecurityConfigurerAdapter, configAuthentication 사용

springboot 2.x + spring security mariadb login 구현 WebSecurityConfigurerAdapter, configAuthentication 사용 최대한 간단한 방법으로 springboot 2.x 프로젝트에 spring security 를 적용해보겠습니다. spri..

aljjabaegi.tistory.com

 

link : https://aljjabaegi.tistory.com/508

 

springboot 2.x spring security 중복로그인 방지, logout 시 session 삭제 안될때 처리

springboot 2.x spring security 중복로그인 방지, logout 시 session 삭제 안될때 처리 기본적인 로그인 처리 방법에 대해서는 아래의 link를 참고하세요. link : springboot 2.x + spring security mariadb logi..

aljjabaegi.tistory.com

 

기본적인 순서는 아래와 같습니다. 

 

1. security-message.properties 생성

2. spring-security-core 에 있는 한글 메시지 정보를 위에 생성한 파일에 추가

3. message 설정 파일 생성

4. 로그인 페이지에서 해당 메시지 출력

 

그럼 진행해보도록 하죠.

 

1. security-message.properties 생성

 

security-message.properties 파일을 아래의 경로에 맞게 생성합니다.

 

 

2. spring-security-core 에 있는 한글 메시지 정보를 위에 생성한 파일에 추가

 

Dependencies 에 추가된 spring-security-core.jar 파일에 한글 메시지 정보를 확인해 1 에서 생성한 파일로 옮겨줍니다.

 

[경로]

 

[내용]

AbstractAccessDecisionManager.accessDenied = 접근이 거부되었습니다.
AbstractLdapAuthenticationProvider.emptyPassword = 비밀번호가 맞지 않습니다.
AbstractSecurityInterceptor.authenticationNotFound = SecurityContext에서 Authentication 객체를 찾을 수 없습니다.
AbstractUserDetailsAuthenticationProvider.badCredentials = 자격 증명에 실패하였습니다.
AbstractUserDetailsAuthenticationProvider.credentialsExpired = 자격 증명 유효 기간이 만료되었습니다.
AbstractUserDetailsAuthenticationProvider.disabled = 유효하지 않은 사용자입니다.
AbstractUserDetailsAuthenticationProvider.expired = 사용자 계정의 유효 기간이 만료 되었습니다.
AbstractUserDetailsAuthenticationProvider.locked = 사용자 계정이 잠겨 있습니다.
AbstractUserDetailsAuthenticationProvider.onlySupports = UsernamePasswordAuthenticationToken만 지원합니다.
AccountStatusUserDetailsChecker.credentialsExpired = 자격 증명 유효 기간이 만료되었습니다.
AccountStatusUserDetailsChecker.disabled = 유효하지 않은 사용자입니다.
AccountStatusUserDetailsChecker.expired = 사용자 계정의 유효 기간이 만료 되었습니다.
AccountStatusUserDetailsChecker.locked = 사용자 계정이 잠겨 있습니다.
AclEntryAfterInvocationProvider.noPermission = domain object {1}에 대한 권한이 Authentication {0}에 없습니다.
AnonymousAuthenticationProvider.incorrectKey = 제공된 AnonymousAuthenticationToken에는 필요로하는 key가 없습니다.
BindAuthenticator.badCredentials = 자격 증명에 실패하였습니다.
BindAuthenticator.emptyPassword = 비밀번호 항목이 비어 있습니다.
CasAuthenticationProvider.incorrectKey = 제공된 CasAuthenticationToken에는 필요로 하는 key가 없습니다.
CasAuthenticationProvider.noServiceTicket = 검증을 위한 CAS 서비스 티켓을 제공할 수 없습니다.
ConcurrentSessionControlAuthenticationStrategy.exceededAllowed = 최대 세션 허용 수 {0}개를 초과하였습니다.
DigestAuthenticationFilter.incorrectRealm = 응답 realm 이름 {0}과 시스템 realm 이름 {1}이 일치하지 않습니다.
DigestAuthenticationFilter.incorrectResponse = 응답이 정확하지 않습니다.
DigestAuthenticationFilter.missingAuth = 'auth' QOP(quality of protection)를 위한 digest 값은 필수 항목입니다. 현재 header 값은 {0}입니다.
DigestAuthenticationFilter.missingMandatory = digest 값은 필수 항목입니다. 현재 header 값은 {0}입니다.
DigestAuthenticationFilter.nonceCompromised = Nonce 토큰이 손상되었습니다. 현재 nonce 값은 {0}입니다.
DigestAuthenticationFilter.nonceEncoding = Nonce 값이 Base64로 인코딩 되어있지 않습니다. 현재 nonce 값은 {0}입니다.
DigestAuthenticationFilter.nonceExpired = Nonce의 유효 기간이 만료되었거나 시간이 초과되었습니다.
DigestAuthenticationFilter.nonceNotNumeric = Nonce 토큰의 첫 글자는 숫자로 시작해야 합니다. 현재 nonce 값은 {0}입니다.
DigestAuthenticationFilter.nonceNotTwoTokens = Nonce는 두 개의 토큰을 만들어야 합니다. 현재 nonce 값은 {0}입니다.
DigestAuthenticationFilter.usernameNotFound = {0} ID를 찾을 수 없습니다.
JdbcDaoImpl.noAuthority = {0} 사용자는 권한이 없습니다.
JdbcDaoImpl.notFound = {0} 사용자를 찾을 수 없습니다.
LdapAuthenticationProvider.badCredentials = 자격 증명에 실패하였습니다.
LdapAuthenticationProvider.credentialsExpired = 자격 증명 유효 기간이 만료되었습니다.
LdapAuthenticationProvider.disabled = 유효하지 않은 사용자입니다.
LdapAuthenticationProvider.expired = 사용자 계정의 유효 기간이 만료 되었습니다.
LdapAuthenticationProvider.locked = 사용자 계정이 잠겨 있습니다.
LdapAuthenticationProvider.emptyUsername = ID에 공백은 허용되지 않습니다.
LdapAuthenticationProvider.onlySupports = UsernamePasswordAuthenticationToken만 지원합니다.
PasswordComparisonAuthenticator.badCredentials = 자격 증명에 실패하였습니다.
PersistentTokenBasedRememberMeServices.cookieStolen = 로그인 상태 유지를 위한 토큰이 일치하지 않습니다. 이전에 사용한 토큰이 타인으로부터 탈취 당했을 수 있습니다.
ProviderManager.providerNotFound = {0}을 위한 AuthenticationProvider를 찾을 수 없습니다.
RememberMeAuthenticationProvider.incorrectKey = 제공된 RememberMeAuthenticationToken에는 필요로 하는 key가 없습니다.
RunAsImplAuthenticationProvider.incorrectKey = 제공된 RunAsUserToken에는 필요로 하는 key가 없습니다.
SubjectDnX509PrincipalExtractor.noMatching = subjectDN\: {0} 내에 매칭되는 패턴이 없습니다.
SwitchUserFilter.noCurrentUser = 요청한 사용자를 찾을 수 없습니다.
SwitchUserFilter.noOriginalAuthentication = Authentication 객체의 원본을 찾을 수 없습니다.

 

추후에 메시지를 수정하셔야 되면 키 값은 수정하시 마시고 메시지만 수정하시면 됩니다. 

 

 

3. message 설정 파일 생성

 

@Configuration
public class MessageConfig {
    @Bean
    public ResourceBundleMessageSource messageSource() {
    	ResourceBundleMessageSource source = new ResourceBundleMessageSource();
    	/* message properties 위치 설정 */
    	source.setBasenames("messages/security_message");
    	/* encoding 룰 설정 */
    	source.setDefaultEncoding("UTF-8");
    	/* 5초간 케싱*/
    	source.setCacheSeconds(5);
    	return source;
    }
}

 

 

이제 클라이언트로 리턴하는 메시지는 위에서 생성한 파일(security-message.properties)에 있는 메시지로 

변경되어 출력이 됩니다.

 

로그인 페이지를 보도록 하죠.

 

4. 로그인 페이지에서 해당 메시지 출력

 

<c:if test="${not empty SPRING_SECURITY_LAST_EXCEPTION}">
	<p class="error">${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message}</p>
	<c:remove var="SPRING_SECURITY_LAST_EXCEPTION" scope="session"/>
</c:if>

 

위의 link파일을 보시면 spring security에서 login validation error 시  /login?error 로 연결됩니다.

그러면서 ${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message} 에 해당 메시지를 담아서 리턴합니다.

 

저의 경우 

AbstractUserDetailsAuthenticationProvider.badCredentials = 잘못된 아이디 이거나 비밀번호가 일치하지 않습니다.

로 수정 하였기 때문에 id나 password가 잘못된 경우 위의 메시지가 출력됩니다.

 

반응형