Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Spring Security локализация ошибок авторизации, i18n для ошибок на форме авторизации 
:(
    Опции темы
carper
Дата 21.7.2010, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 2.3.2005

Репутация: 2
Всего: 8



Spring Security v.3.03
На форме логина (login.jsp) 
Код

...
    ошибка: <c:out value="${SPRING_SECURITY_LAST_EXCEPTION.message}"/>.<br />
...


Хочется локализовать сообщение об ошибке, НЕ прибегая к редактированию/созданию нового файла/ов
messаges.properties ВНУТРИ spring-security-core-3.0.3.RELEASE.jar.

Прописывание в файле конфигурации:
Код

<bean id="messageSource"  class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
       <property name="basenames">
         <list>
           <value>WEB-INF/i18n/msg/mymesg</value>
           <value>WEB-INF/i18n/msg/messages</value>
          </list>
        </property>
       <property name="cacheSeconds" value="3600"/>
       <property name="useCodeAsDefaultMessage" value="true"/> 
    </bean>  


Ничего не дает - сообщения из обоих файлов ресурсов отлично выводятся на той же login.jsp с использованием тэгов spring:message code=... (т.е. файлы ресурсов видны и гарантированно содержат русский текст => не может быть путаницы), но локализации сообщений об ошибках не получается.
Так и получаю свое Bad creditians.

Пробовал вместо (и вместе тоже - и так и так пробовал) вышеприведенного фрагмента использовать
Код

<bean id="messageSource" class="org.springframework.security.core.SpringSecurityMessageSource">
    <property name="basename" value="WEB-INF/i18n/msg/messages"/>
  </bean>

Тогда не локализуется вообще ничего.


PM MAIL   Вверх
MisterCleric
Дата 21.7.2010, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Привет. Если честно, то ничего смертельного в этом нет, что ты создаешь свой файлик, который будет содержать перевод мессаджей, и положишь его внутрь spring-security-core-3.0.3.RELEASE.jar. 
Это надо сделать всего один раз.
А так ты больше потратишь времени на выяснение, как же его заставить читать твой файлик внутри твоего проекта.


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
carper
Дата 21.7.2010, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 2.3.2005

Репутация: 2
Всего: 8



Цитата

Если честно, то ничего смертельного в этом нет, что ты создаешь свой файлик, 


1. Это напоминает хак, что почти всегда есть плохо.
Ну, хотя бы потому, что при переходе на следующую версию, надо помнить о необходимости такой подмены.

Со временем хаки разной степени глубины накапливаются и приложение становится плохо управляемым.

2. У Spring Security файлы свойств есть и для других библиотек, мне что теперь везде перепаковывать библиотеки с новыми ресурсами?

3. Если я захочу менять тексты сообщений в зависимости от приложения, мне что поддерживать одновременно несколько jar - каждый со своими файлами свойств?

4. Поскольку стандартный механизм поиска файлов свойств авторы Spring Security вроде как не собирались отменять, то есть большая вероятность, что мне все же следует понять, что я делаю не так.
PM MAIL   Вверх
carper
Дата 21.7.2010, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 2.3.2005

Репутация: 2
Всего: 8



Все усугубилось :(

Попробовал добавить свой файл (чтобы не ошибиться с локалью, предварительно потер все файлы свойств из
spring-security-core-3.0.3.RELEASE.jar) свойств с именем messages.properties, содержащий руссифицированные
сообщения.
Результат тот-же - похоже файлы свойств вообще не ищутся, ни при каких условиях, и всегда выдаются сообщения
об ошибках жестко заданные в коде! :(

P.S. Разумеется в basenames пробовал задавать <value>org/springframework/security/messages</value>
Именно там в jar-нике они и лежат.
PM MAIL   Вверх
ki6opr
Дата 22.7.2010, 02:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 20.12.2006

Репутация: нет
Всего: нет



нужно создавать LocalResolver, просто спринг по умолчанию локалью не интересуется
тут

Ну и у себя в проектах я message.properties которые внутри спринга нетрогаю, а делаю также как и вы в первом посте (указав их в мессадж сорс)
PM MAIL ICQ   Вверх
carper
Дата 22.7.2010, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 2.3.2005

Репутация: 2
Всего: 8



Цитата

нужно создавать LocalResolver, просто спринг по умолчанию локалью не интересуется


Когда я оставляю единственный файл - messages.properties, Spring должен использовать его по-умолчанию, независимо от найденной локали.  Так?

В этом файле подменяю сообщения на свои, но они не выводятся, а выводятся жестко закодированные в коде англоязычные.

Отсюда вывод - я где-то накосячил сам.

Вот накидал работающий тестовый примерчик, позволю себе привести файлы конфигурации:
web.xml
Код

<?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">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
                /WEB-INF/applicationContext-security.xml
        </param-value>
    </context-param>
    <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    
  <!-- ***************** Подключение SpringSecurity ***************** -->
  <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>
  
   <listener>
   <listener-class>
     org.springframework.security.web.session.HttpSessionEventPublisher
   </listener-class>
  </listener>
  
    <!-- ***************** Подключение собственно Spring ***************** -->    
   <servlet>
     <servlet-name>mainSpringCfg</servlet-name>
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     <load-on-startup>1</load-on-startup>
   </servlet>

   <servlet-mapping>
     <servlet-name>mainSpringCfg</servlet-name>
     <url-pattern>*.html</url-pattern>
   </servlet-mapping>
    
  <welcome-file-list>
    <welcome-file>redirect.jsp</welcome-file>
  </welcome-file-list>
</web-app>




applicationContext-security.xml 
Код

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="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.0.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">

   <http auto-config='true'>
    <intercept-url pattern="/login.html*" access="IS_AUTHENTICATED_ANONYMOUSLY" requires-channel="https"/>
    <intercept-url pattern="/css/**" filters="none"/>
    <intercept-url pattern="/js/**"  filters="none"/>
    <intercept-url pattern="/pic/**" filters="none"/>
    <intercept-url pattern="/**" access="ROLE_USER" requires-channel="https"/>
    
     <form-login login-page='/login.html' default-target-url='/index.html' authentication-failure-url="/login.html?login_error=1"/>
    
    <port-mappings>
       <port-mapping http="8088" https="8445"/>
    </port-mappings>
    
    <session-management invalid-session-url="/login.html" session-fixation-protection="newSession">
      <concurrency-control max-sessions="1" error-if-maximum-exceeded="true"/>
    </session-management>
    
    <logout logout-success-url="/login.html"/>
    
  </http>
  
     
  <authentication-manager>
    <authentication-provider>
      <user-service>
        <user name="jimi" password="jimispassword" authorities="ROLE_USER, ROLE_ADMIN" />
        <user name="bob"  password="bobspassword"  authorities="ROLE_USER" />
      </user-service>
    </authentication-provider>
  </authentication-manager>
  
</beans:beans>


mainSpringCfg-servlet.xml
Код

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd">
   
    <bean id="viewResolver"  class=" org.springframework.web.servlet.view.InternalResourceViewResolver" >
      <property name="prefix">
        <value>/</value>
      </property>
      <property name="suffix">
          <value>.jsp</value>
       </property>
       <property name="order"><value>1</value></property>
    </bean>         
    
       
    <mvc:annotation-driven/> 
    <context:component-scan base-package="seccontrollers" ></context:component-scan>
    
       
    <!-- ************************************************************************ -->
    <bean id="messageSource"  class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
       <property name="basenames">
         <list>
           <value>WEB-INF/i18n/msg/mymesg</value>
                  <!-- Вот здесь руссифицированные сообщения от Spring Security-->
           <value>WEB-INF/i18n/msg/messages</value>
                   <!-- Вот здесь руссифицированные сообщения от Spring Security в самом jar-нике-->
           <value>org/springframework/security/messages</value>
          </list>
        </property>
       <property name="cacheSeconds" value="3600"/>
       <property name="useCodeAsDefaultMessage" value="true"/> 
    </bean>  
    
        <!-- В общем-то пока плевать на локаль, т.к. SpringSecurity похоже вообще не видит 
         messages.properties ни для какой локали -->
    <bean id="localeResolver"  class="org.springframework.web.servlet.i18n.CookieLocaleResolver" > 
        <property name="cookieName" value="locale" />
        <property name="cookieMaxAge" value="3600" />
        <property name="defaultLocale" value="ru" />
     </bean>
    
    <mvc:view-controller path="/welcome.html" view-name="WEB-INF/sec/jsp/MyJsp"/>
    <mvc:view-controller path="/index.html" view-name="index"/>
    <mvc:view-controller path="/login.html" view-name="login"/>
</beans>



login.jsp
Код

<%@ page  language="java" contentType="text/html;charset=UTF-8" pageEncoding="windows-1251" %>
<%@taglib prefix='c'      uri='http://java.sun.com/jstl/core_rt' %>
<%@taglib prefix='fmt'      uri='http://java.sun.com/jstl/fmt' %>
<%@taglib  prefix="spring" uri="http://www.springframework.org/tags"%>

<html>
  <head>
    <title>Login</title>
  </head>
  <body onload="document.f.j_username.focus();">
    <h1>Login</h1>
    Valid users:
    <p>username <b>jimi</b>, password <b>jimispassword</b></p>
    <p>username <b>bob</b>, password <b>bobspassword</b></p>
    
        <c:if test="${not empty param.login_error}">
       <b>SPRING_SECURITY_LAST_EXCEPTION.message - вот эта бяка всегда на английском!</b>
        Ошибка: <c:out value="${SPRING_SECURITY_LAST_EXCEPTION.message}"/>.<br />
      </c:if>
   Произвольное сообщение из файла messages на русском, и это РАБОТАЕТ, т.е. файл виден: <spring:message code="AuthByAdapterProvider.incorrectKey"/><br />
    
  
    <form name="f" action="<c:url value='j_spring_security_check'/>" method="POST">
      <table>
        <tr><td><spring:message code="login" text="default text message cannot be found"/>: </td><td><input type='text' name='j_username' value='<c:if test="${not empty param.login_error}"><c:out value="${SPRING_SECURITY_LAST_USERNAME}"/></c:if>'/></td></tr>
        <tr><td>Password:</td><td><input type='password' name='j_password'></td></tr>
        <tr><td><input type="checkbox" name="_spring_security_remember_me"></td><td>Don't ask for my password for two weeks</td></tr>

        <tr><td colspan='2'><input name="submit" type="submit"></td></tr>
        <tr><td colspan='2'><input name="reset" type="reset"></td></tr>
      </table>

    </form>
     
  </body>
</html>



В примере все работает - авторизация, https, тэги Spring и т.п., не работает только попытка руссификации
SPRING_SECURITY_LAST_EXCEPTION.message.

Ну и еще {SPRING_SECURITY_LAST_USERNAME}, если логин ввести на русском, то при повторном запросе логина похоже перекодируется в коды UTF, но с этим пока можно смириться. smile

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0684 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.