spring boot security login error message 한글 설정
spring boot security login error message 한글 설정
spring boot 프로젝트에 spring security 적용방법은 아래의 link를 참고하세요.
link : https://aljjabaegi.tistory.com/507
link : https://aljjabaegi.tistory.com/508
기본적인 순서는 아래와 같습니다.
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가 잘못된 경우 위의 메시지가 출력됩니다.