0

我将我的项目配置为国际,但现在我试图更改 spring 安全自定义消息但没有成功......我已经阅读并尝试了一些东西但没有成功。我可以看到通常的消息,但不能看到弹簧安全消息。

这是我的 servlet-context.xml:

<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />

<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />

<!-- Tiles -->
<beans:bean  id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
    <beans:property name="definitions">
        <beans:list>
            <beans:value>/WEB-INF/tiles.xml</beans:value>
        </beans:list>
    </beans:property>
</beans:bean>

<beans:bean   class="org.springframework.web.servlet.view.tiles2.TilesViewResolver">      
    <beans:property 
        name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/>                
</beans:bean>

<context:component-scan base-package="com.company.projectMvc" />


<!-- default locale  -->
<beans:bean class="org.springframework.web.servlet.i18n.SessionLocaleResolver" id="localeResolver"> 
    <beans:property name="defaultLocale" value="es"/> 
 </beans:bean> 


 <interceptors> 
    <beans:bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
         <beans:property name="paramName" value="language"/> 
    </beans:bean> 
 </interceptors> 

<!-- Messages files -->
<beans:bean id="messageSource"  name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <beans:property name="basename" value="/resources/messages/messages" />
</beans:bean>

这是我的spring-security.xml:

<http auto-config="true" use-expressions="true" >
    <intercept-url pattern="/test" access="isAuthenticated()" />
    <intercept-url pattern="/**" access="isAuthenticated()" />
    <intercept-url pattern="/home" access="permitAll" />

    <form-login  default-target-url="/home"/>
    <logout logout-success-url="/test" />
</http>


<authentication-manager>
   <authentication-provider>
    <jdbc-user-service data-source-ref="dataSource"

       users-by-username-query="
          select username,password,enabled,fullname
          from users where username=?" 

       authorities-by-username-query="
          select u.username, ur.authority from users u, user_roles ur 
          where u.user_id = ur.user_id and u.username =?  " 

    />
   </authentication-provider>
</authentication-manager>

更新 1 我尝试了您的解决方案,复制了 spring 安全文件并没有成功地更改它们。在我阅读了带有 AcceptHeaderLocaleResolver 和 i18n 的这个线程 Spring Security 之后, 我也尝试了该解决方案但没有成功这里是我更新的 servlet-context.xml 文件:

    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />

<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />

<!-- Tiles -->
<beans:bean  id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
    <beans:property name="definitions">
        <beans:list>
            <beans:value>/WEB-INF/tiles.xml</beans:value>
        </beans:list>
    </beans:property>
</beans:bean>

<beans:bean   class="org.springframework.web.servlet.view.tiles2.TilesViewResolver">      
    <beans:property 
        name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/>                
</beans:bean>

<context:component-scan base-package="com.company.projectMvc" />

 <!-- default locale pt_PT -->
<beans:bean class="org.springframework.web.servlet.i18n.SessionLocaleResolver" id="localeResolver"> 
    <beans:property name="defaultLocale" value="pt_PT"/> 
 </beans:bean> 

<!-- Messages files -->
<beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <beans:property name="basenames">
    <beans:list>
        <beans:value>/resources/messages/messages</beans:value>
        <beans:value>/resources/messages/securityMessages</beans:value>
    </beans:list>
 </beans:property>



</beans:bean>

<!-- com o parametro locale no URL conseguimos definir o locale que quisermos -->
 <interceptors> 
    <beans:bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
         <beans:property name="paramName" value="lang"/> 
    </beans:bean> 
 </interceptors> 

这是我更新的 web.xml

第1部分

第2部分

4

2 回答 2

2

答案可能有点晚,但面临类似问题的其他人可能会发现它很有用:

您的问题是安全 bean 在根 Web 应用程序上下文中,但messageSource在 servlet 应用程序上下文源中。这意味着安全 bean 不知道您的消息源。只需将您的消息源定义移动到根 Web 应用程序上下文。

于 2013-06-14T21:01:54.180 回答
1

不知道你有没有试过这个

  1. 从中复制消息文件org.springframework.security并更改
    它们。
  2. 使用这些文件配置您的消息源。

默认情况下 Spring 安全使用org.springframework.security.core.SpringSecurityMessageSourceThis is from javadocs

默认情况下,所有需要消息本地化的 Spring Security 类都将使用此类。但是,所有此类类也将实现 MessageSourceAware,以便应用程序上下文可以注入替代消息源。因此,此类仅在部署环境未指定备用消息源时使用。

于 2012-09-15T22:57:43.960 回答