5

Tôi bị kẹt, có thể đã bỏ sót điều gì đó trong tài liệu hoặc đã phạm một số sai lầm nhỏ.Bảo mật mùa xuân với AcceptHeaderLocaleResolver và i18n

Bảo mật mùa xuân 3.0.5 được tích hợp trong ứng dụng Spring MVC 3.0.5 của tôi. AcceptHeaderLocaleResolver được sử dụng để phát hiện Locale và nội địa hóa hoạt động ok ngoại trừ các thông báo lỗi bảo mật.

Tôi đã sao chép thư.properties từ gói bảo mật mùa xuân và được đổi tên và được thêm vào bean hiện tại "messageSource" (ResourceBundleMessageSource) với danh sách giá trị.

Như đã nói trước đó tất cả văn bản và tin nhắn được bản địa hóa chính xác, ngoại trừ các đường nối bảo mật để sử dụng các tin nhắn tiếng Anh được mã hóa cứng.

Bất kỳ ý tưởng nào về cách giải quyết vấn đề này?

UPDATE:
My xy-servlet.xml chứa:

... 
<mvc:resources mapping="/resources/**" location="/resources/" /> 
... 
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basenames"> 
     <list> 
      <value>defaultMessages</value> 
      <value>securityMessages</value> 
     </list> 
    </property> 
</bean> 

và các tập tin

  • defaultMessages.properties
  • defaultMessages_en.properties
  • defaultMessages_de.properties
  • defaultMessages_sl.properties

  • securityMessages.properties
  • securityMessages_en.properties
  • securityMessages_de.properties
  • securityMessages_sl.properties

nhưng defaultMessages wor k ok. securityMessages thì không. Tôi đã thực hiện các thay đổi nhỏ trong tất cả các tệp securityMessages nhưng chúng bị bỏ qua và các thông báo bằng tiếng Anh được mã hóa cứng được hiển thị.

CẬP NHẬT v2: My phối-servlet.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:sec="http://www.springframework.org/schema/security" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd"> 

<context:component-scan base-package="com.example.sampleapp1" /> 
<context:annotation-config /> 

<mvc:annotation-driven/> 

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

<bean id="viewResolver" 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
    p:prefix="/WEB-INF/views/" p:suffix=".jsp" /> 

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

<!-- Persistence --> 
<bean id="myPMF" class="org.springframework.orm.jdo.LocalPersistenceManagerFactoryBean"> 
    <property name="persistenceManagerFactoryName" value="transactions-optional"/> 
</bean>  

<!-- Form Validator --> 

</beans> 

Trả lời

5

Cuối cùng, giải pháp!

Đậu cho thông báo bảo mật rõ ràng phải tôi khai báo trong applicationContext-security.xml và không phải trong ngữ cảnh ứng dụng xml config ... Tôi không tìm thấy điều này ở bất kỳ đâu trong sách hướng dẫn!

Trong trường hợp giải pháp đúng của tôi là đậu trong applicationContext-security.xml:

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

Nhờ @bluefoot@jtoberon đối với một số ý tưởng.

UPDATE: Để hoạt động đúng web.xml này phải chứa localizationFilter trước springSecurityFilterChain, web.xml của tôi là:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

<!-- The definition of the Root Spring Container shared by all Servlets and Filters --> 
<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/spring/applicationContext-security.xml</param-value> 
</context-param> 

<!-- i18n --> 
<filter> 
    <filter-name>localizationFilter</filter-name> 
    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class> 
</filter> 

<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<!-- i18n --> 
<filter-mapping> 
    <filter-name>localizationFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
    <dispatcher>ERROR</dispatcher> 
</filter-mapping> 


<!-- Creates the Spring Container shared by all Servlets and Filters --> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<!-- Processes application requests --> 
<servlet> 
    <servlet-name>appServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>appServlet</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

</web-app> 


Kiểm tra dòng sau khi bình luận i18n.

+0

Tôi không có nhiều kinh nghiệm với Spring MVC và tôi không biết rằng tệp 'xy-servlet.xml' không phải là tệp cấu hình ngữ cảnh của ứng dụng. Dù sao tôi rất vui vì nó đã hoạt động. – bluefoot

+0

Tôi đang sử dụng Spring 3.2 và dường như phải đối mặt với cùng một vấn đề này, nhưng tiếc là giải pháp này dường như không hoạt động đối với tôi. – Ryan

3

Tôi không biết làm thế nào bạn đã làm điều đó (bạn không nói), nhưng để sử dụng các thông điệp bó đó là vận chuyển với an ninh mùa xuân (thay vì tin nhắn văn bản được mã hóa cứng), tôi chỉ phải khai báo một bean ResourceBundleMessageSource và thiết lập basenames tài sản:

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

Điều đó sẽ thay đổi messa ges để pt_BR, bằng cách làm cho mùa xuân bằng cách sử dụng đậu này thay vì mặc định một (không cần phải sao chép các tập tin vào một nơi khác, giả sử, tất nhiên, bạn có jar trên classpath của bạn).

+0

Tôi đồng ý, điều này cũng phù hợp với tôi. – carlspring

+0

@bluefoot Vui lòng kiểm tra câu hỏi đã cập nhật của tôi. Tôi không biết cách sử dụng câu trả lời của bạn. Tôi có nên sử dụng: ' org/springframework/security/securityMessages_sl'? – Solata

+0

tại sao bạn tạo thuộc tính của riêng mình? một số trong số chúng đã được đưa vào trong lõi của lõi an ninh mùa xuân. Có lẽ các tệp của bạn không được tìm thấy trong classpath. Chỉ cần xóa ' defaultMessages securityMessages' và thay thế bằng ' org/springframework/security/messages_de' (giả sử rằng 'xy-servlet.xml' là tệp cấu hình ngữ cảnh ứng dụng của bạn) và xem điều gì xảy ra. – bluefoot

1

Dưới đây là một vài ý tưởng:

  1. Có một cơ hội mà các thông điệp an ninh không phải là trên classpath? Tất cả các tệp tài nguyên của bạn có nằm trong cùng một thư mục không? Bạn đang đặt chúng trong WEB-INF/lớp học, và nếu không thì làm thế nào để bạn biết họ đang trên classpath?
  2. Bạn có không gian tên hoặc xung đột chính không? Nói cách khác, là các giá trị mặc định cho các thông báo lỗi bảo mật đã được xác định trong tệp tài nguyên khác (tệp đang hoạt động)?
+0

Cảm ơn các ý tưởng! ** 1. ** Làm cách nào để kiểm tra xem thư có nằm trên đường dẫn lớp không? Tất cả các tệp đều nằm trong cùng một thư mục và trong các lớp WEB-INF ** 2. ** Trong các tệp mặc định của tôi, tôi không tin rằng tôi có xung đột không gian tên hoặc khóa. – Solata

Các vấn đề liên quan