2013-04-30 3 views
2

мне нужно войти в систему с j_spring_security_check использованием специальных символов в имени пользователя и/или пароля с помощью URLВесна безопасности и специальные символы

http://localhost:8080/appname/j_spring_security_check?j_username=username&j_password=üüü 

не работает и

http://localhost:8080/appname/j_spring_security_check?j_username=username&j_password=%c3%bc%c3%bc%c3%bc 

(с "üüü" urlencoded) не работает

Любое предложение? Дайте мне знать, если вам нужно увидеть любую другую конфигурацию.

Благодаря

+0

Эта проблема возникает и для меня. У нас есть стандартная форма входа в систему POSTing для Spring Security, и как только пароль содержит что-либо вроде öäüéàè, вход в систему невозможен. Проблема возникает с пользовательским интерфейсом UserDetailsService на основе hibernate, а также с базовым компонентом ActiveDirectory на базе Ldap. – yglodt

ответ

5

Стандарт Java сервлетов плачевно бедных на поддержку Unicode. Значение по умолчанию ISO-8859-1 бесполезно, и до сих пор нет совместимых с контейнером средств для настройки его на что-то еще.

Метод фильтра в ответе matteosilv работает для органов запроса. Для параметров в URL-адресе вы должны использовать параметры, специфичные для контейнера. Например, в Tomcat, установить URIEncoding на <Connector> в server.xml; в Glassfish Это <parameter-encoding> в glassfish-web.xml.

(Если вы должны работать в полностью кросс-контейнером совместимы образом вы в конечном итоге того, чтобы написать свою собственную реализацию getParameter(), которая печально. Bad Servlet.)

Однако в любом случае плохая идея передать поля формы входа в параметры GET URL.

Это, во-первых, потому, что логин вызывает изменение состояния, поэтому оно не является «идемпотентным». Это делает GET неподходящим методом и вызывает нагрузку на такие практические проблемы, как потенциальная запись в журнал при навигации по странице или невозможность входа в систему из-за кэширования и т. Д.

Во-вторых, существует множество способов, по которым URL-адреса могут «течь», включая отслеживание рефереров, протоколирование, прокси и сохранение истории браузера. Следовательно, вы никогда не должны помещать какие-либо конфиденциальные данные, такие как пароль в URL-адрес, в том числе в форме формы GET.

Вместо этого я предлагаю использовать форму отправки POST вместе с CharacterEncodingFilter.

+0

Да, мне тоже это не нравится, но это код клиента, и я не говорю об этом. Он используется для аутентификации из приложения C# через интрасеть, поэтому регистрация/прокси/история не должна быть проблемой. – capitano666

0

Может быть, encodingFilter в файле web.xml может быть полезным:

<filter> 
<filter-name>encodingFilter</filter-name> 
    <filter-class> 
     org.springframework.web.filter.CharacterEncodingFilter 
    </filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>encodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Источник: Spring security: Form login special characters

+0

Нет, я уже пробовал это. Обратите внимание, что логин из веб-формы работает должным образом (ссылаясь на ваш источник). Это только URL-адрес, который не работает для меня. – capitano666

0

Вопрос был фактически решен для меня, перемещая CharacterEncodingFilter ВЫШЕ SpringSecurityFilterChain в web.xml.

Смежные вопросы