Spring Security - 本地化消息

时间:2016-07-23 21:01:47

标签: java spring-security localization message

我试图本地化Spring Security抛出的消息。我使用的是Spring 4.3.1和Spring Security 4.1.1。 使用messages.properties进行其他值的本地化工作正常,只有Spring Security消息无法正常工作。无论语言如何,我总是得到相同的信息(在我的情况下,我总是得到德语信息(" Benutzername oder Passwort falsch"))。有什么东西我忘了配置吗?

来自mvc-dispatcher-servlet.xml的

片段

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basenames" value="messages"/>
</bean>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>
<mvc:interceptors>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="language"/>
    </bean>
</mvc:interceptors>

loadByUsername方法(如果需要)

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DisabledException {
    Member member = memberDao.getMember(username);
    if (member == null) {
        throw new UsernameNotFoundException("user not found...");
    } ...

的web.xml

<!--DispatcherServlet-->
<servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<!--ContextLoaderListener-->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/mvc-dispatcher-servlet.xml,
        /WEB-INF/spring-security.xml
    </param-value>
</context-param>

<filter>
    <filter-name>requestContextFilter</filter-name>
    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>requestContextFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<!-- Spring Security Chain Filter -->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

messages_de.properties

AbstractUserDetailsAuthenticationProvider.badCredentials=Benutzername oder Passwort falsch
field.username=Benutzername

messages_en.properties

AbstractUserDetailsAuthenticationProvider.badCredentials=Wrong username or password
field.username=Username

1 个答案:

答案 0 :(得分:0)

根据Spring Security的官方文档...

  

Spring Security依靠Spring的本地化支持来实际查找适当的消息。为了使它起作用,您必须确保来自传入请求的语言环境存储在Spring的org.springframework.context.i18n.LocaleContextHolder中。 Spring MVC的DispatcherServlet自动为您的应用程序执行此操作,,但是由于在此之前调用了Spring Security的过滤器,因此需要在调用过滤器之前将LocaleContextHolder设置为包含正确的Locale。您可以自己在过滤器中执行此操作(该过滤器必须位于web.xml中的Spring Security过滤器之前),也可以使用Spring的RequestContextFilter 。有关在Spring中使用本地化的更多详细信息,请参考Spring Framework文档。

解决方案::添加一个CustomLocaleFilter并将其注册到SecurityFilters之前