2013-05-26 3 views
4

Привет, мне нужно добавить новое исключение в форму входа в Spring, все работает отлично, за исключением того, что я хочу иметь собственное сообщение об ошибке (до сих пор он отображает «неправильный логин/пароль»).Spring security custom AuthenticationException message

У меня есть переопределить метод проверки подлинности попытки по умолчанию от Имя пользователя Фильтр пароль аутентификации:

@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 но сообщение об ошибке всегда один из плохих учетных данных, как я могу это изменить?

Спасибо

+0

Вам нужно показать другое сообщение на странице входа или в файле журнала? Если это страница входа в систему, вам необходимо ее настроить: '' – Michael

+0

На странице входа. –

+0

На странице входа в систему они отображаются где-то для каждого AuthenticationException (исключение BadCredentialsException, LockedException ... см. В org.springframework.security.authentication) из исключения в пользовательское сообщение, я хочу отобразить собственное сообщение об ошибке. –

ответ

11

Вы должны попробовать СООБЩЕНИЯ локализующих SPRING БЕЗОПАСНОСТЬ.
Попробуйте добавить эти строки в свой файл ApplicationContext.xml. Где остальные ваши весенние бобы.

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

Вы должны найти свой весенний класс по умолчанию, которые <KEY, MESSAGE> сохраняются. Сделайте свой файл myMessage с тем же KEY s и локализованным MESSAGE s.


На основе вашего комментария у вас есть messages.properties в вашем проекте. Так что все, что вам нужно сделать, это иметь MESSAGE для каждого из этих ключей внутри этого файла свойств, чтобы иметь полностью локализованные сообщения:

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= 
+0

Да, у меня уже есть ресурс сообщений, но каков ключ для моего пользовательского исключения? –

+0

Обновлен ответ для вас. Все, что вам нужно сделать, это установить «СООБЩЕНИЕ» для каждого ключа. –

+0

Почему бы вам не написать отзыв?Вы можете принять это как ответ, если это решит вашу проблему или продвинет ее, если вы сочтете это полезным. –

2

В ваших messages.properties (или как бы вы назвали его), добавьте line:

AbstractUserDetailsAuthenticationProvider.badCredentials=The credentials you supplied are invalid. 

Вам не нужно исключение CustomAuthenticationException.

1

Создать файл свойств в классе пути, как loginMessage.properties

В этом файле свойства укажите

AbstractUserDetailsAuthenticationProvider.badCredentials = Имя пользователя/Пароль неверен.

Добавьте следующий компонент в вашем applicationContext.xml,

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

После этого u'll получить сообщение, как имя пользователя/пароль неверны. вместо Bad Credentials