Spring security - Exibir mensagens em português

Oi pessoal
Eu estou fazendo uns testes com spring security e queria personalizar as mensagens de exceções pra exibir tudo em português.
Ex.: Bad credentials -> Usuário ou senha incorretos
User is disabled -> Usuário desativado

Eu li umas coisas sobre criar um arquivo .properties mas não consegui fazer.

Alguem ja fez isso pra me ensinar ou passar um tutorial?

messages.propertieserr.name=Name 3-50 characters is required. err.email=Email 3-50 characters is required. err.permission=Permission is required. err.recipient=Recipient is required. err.permission.invalid=The indicated permission is invalid. err.recipient.length=The recipient is too long (maximum 100 characters). BindAuthenticator.badCredentials=Username/Password entered is incorrect. AbstractUserDetailsAuthenticationProvider.disabled=Your account is diabled, please contact administrator.applicationContext.xml[code]<?xml version="1.0" encoding="UTF-8"?>

<bean id="testeSpringDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/banco?autoReconnect=true"/>
    <property name="username" value="user"/>
    <property name="password" value="senha"/>
</bean>

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

[/code]applicationContext-security[code]<?xml version="1.0" encoding="UTF-8"?>

<b:beans xmlns=“http://www.springframework.org/schema/security
xmlns:b=“http://www.springframework.org/schema/beans
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=“http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd”>

<http auto-config="true">

    <intercept-url pattern="/administrador/**" access="ROLE_ADMINISTRADOR" />
    <intercept-url pattern="/vendedor/**" access="ROLE_VENDEDOR" />
    <intercept-url pattern="/usuario/**" access="ROLE_USUARIO" />

    <access-denied-handler error-page="/access-denied.xhtml" />

    <form-login login-page="/index.xhtml?login_visible=true"
        always-use-default-target="false"
        default-target-url="/index.xhtml"
        authentication-failure-url="/index.xhtml?login_error=true" />

    <logout />

    <remember-me />
    
</http>

<authentication-manager>
    <authentication-provider>
        <jdbc-user-service data-source-ref="testeSpringDataSource"
            users-by-username-query="SELECT login, senha, ativo
                FROM usuario
                WHERE login = ?"
            authorities-by-username-query="SELECT u.login, p.descricao
                FROM usuario u, usuario_permissao up, permissao p
                WHERE u.id = up.usuario AND p.id = up.permissao AND u.login = ?" />
    </authentication-provider>
</authentication-manager>

</b:beans>[/code]

Saudações, cara estou com o mesmo problema, queria pegar as mensagens e as exibir em portuuês, eu fiz de um jeito aqui, que toda a hora aparece a mesma mensagem, mas é uma gambiarra, não sei exatamente quando é a senha ou o login.

Você conseguiu resolver este problema? ou alguém mais conseguiu resolver este problema?

Obrigado

Cara eu desisti de usar o spring security por que ele estava fazendo todas as minhas páginas ficarem bem mais demoradas à carregar (eu provavelmente configurei alguma coisa errada)
Pra saber se o usuário ou a senha estão incorretos eu não sei como faz já que a exception que os 2 erros retornam é BadCredentials. Normalmente por questões de segurança nem é bom informar isso ao usuário.
Mas para exibir as mensagens em português como eu não consegui fazer da maneira certa eu fiz usando um FacesConverter (que também é meio ganbiarra) assim:

No outputText que exibe as mensagens eu colocava um conversor.
pagina.xhtml

<h:outputText>
   <f:converter converterId="mensagensConverter" />
</h:outputText>

MensagensConverter.java

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

@FacesConverter(value = "mensagensConverter")
public class MensagensConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        return converterMensagem(value);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return converterMensagem(value.toString());
    }

    private String converterMensagem(String mensagem) {
        mensagem = mensagem.replace("BadCredentials", "Usuário ou senha incorretos");
        mensagem = mensagem.replace("OutraException", "Sua mensagem em português");
        return mensagem;
    }

}

Se tiver algum erro posta a pergunta ai, pois como eu disse eu nem to usando mais dessa forma então não testei se o código ai ta funcionando, mas era mais ou menos assim.

Entendi o que você fez, vou fazer uns testes, eu fiz uma gambiarra mas acho que o sua maneira ficou melhor, vou tentar fazer assim.

Obrigado.

Retornando este forúm, para quem esta com estes problema eu consegui resolver e quero compartilhar.

No arquivo spring-security-config.xml,

insira as tags.

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

ou dependendo da versão insira

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

no direitorio WEB-INF, crie uma pasta com o nome “classes” e crie o arquivo message.properties com o conteudo

AbstractUserDetailsAuthenticationProvider.locked=Conta de usuário está bloqueado
AbstractUserDetailsAuthenticationProvider.disabled=Usuário está desativado
AbstractUserDetailsAuthenticationProvider.expired=Conta do usuário expirou
AbstractUserDetailsAuthenticationProvider.credentialsExpired=Credenciais do usuário expirou
AbstractUserDetailsAuthenticationProvider.badCredentials=Incorrect usuario and/or senha
BindAuthenticator.badCredentials=Incorreto usuário and/or senha
UserDetailsService.locked=Conta de usuário está bloqueado
UserDetailsService.disabled=Usuário está desativado
UserDetailsService.expired=Conta do usuário expirou
UserDetailsService.credentialsExpired=Credenciais do usuário expirou