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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Spring: ws + security, Spring ws и Spring security 
V
    Опции темы
Vladus
Дата 25.5.2009, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем доброго времени суток.
Появилась необходимость к приложению, имеющему веб сервисы прикрутить security. Веб сервисы реализованы с помощью Spring Web Service, security - Spring security. Теперь о проблеме: как заставить веб сервисы работать с секьюрити(под секьюрити я понимаю разграничение прав), ибо раньше был только один пользователь и базовая томкатовская аутентификация. На спринговом сайте нашел совсем крохи, буквально используйте SpringPlainTextPasswordValidationCallbackHandler, а про то, как его использовать и где - не написано совсем ничего.

Код

  <bean id="springSecurityHandler"
      class="org.springframework.ws.soap.security.xwss.callback.SpringPlainTextPasswordValidationCallbackHandler">
    <property name="authenticationManager" ref="authenticationManager"/>
  </bean>

  <bean id="authenticationManager" class="org.springframework.security.providers.ProviderManager">
      <property name="providers">
          <bean class="org.springframework.security.providers.dao.DaoAuthenticationProvider">
              <property name="userDetailsService" ref="userDetailsService"/>
          </bean>
      </property>
  </bean>

  <bean id="userDetailsService" class="com.mycompany.app.dao.UserDetailService" />

т.е. понятно, что к userDetailsService нужно подставить свой дао, который бы вытаскивал пользователя с базы(что я и сделал), а что делать дальше, и как должна проходить аутентификация для веб сервисов - непонятно совсем :(

Вообщем, может я не ясно обрисовал картину, но буду рад любой помощи.
PM MAIL   Вверх
MisterCleric
Дата 25.5.2009, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



может тут что-нибудь прочитаешь?
Spring-WS

С security работал, но только как безопасность web-приложения.
Сервисы через EJB3.
Секьюрить пока не было требования. 
Так что пока ничего дельного не подскажу...


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


Шустрый
*


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

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



MisterCleric, спасибо, но я уже читал этот мануал, и из того, что меня интересует, а именно аутентификации с помощью этого класса (я так понял, что его использование - стандартный подход при связывании спринг секьюрити и веб сервисов) - SpringPlainTextPasswordValidationCallbackHandler там панисано лишь то, что я написал выше и пара общих фраз
PM MAIL   Вверх
MisterCleric
Дата 25.5.2009, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



В Spring-WS есть выше такой пример:
Код

<beans>
    <bean id="wsSecurityInterceptor"
        class="org.springframework.ws.soap.security.xwss.XwsSecurityInterceptor">
        <property name="policyConfiguration" value="classpath:securityPolicy.xml"/>
        <property name="callbackHandlers">
            <list>
                <ref bean="certificateHandler"/>
                <ref bean="authenticationHandler"/>
            </list>
        </property>
    </bean>
    ...
</beans>


в JavaDoc org.springframework.ws.soap.security.AbstractWsSecurityInterceptor 
написано:
 
Цитата

/**
 * Interceptor base class for interceptors that handle WS-Security. Can be used on the server side, registered in a
 * {@link AbstractEndpointMapping#setInterceptors(EndpointInterceptor[]) endpoint mapping}; or on the client side, on
 * the {@link WebServiceTemplate#setInterceptors(ClientInterceptor[]) web service template}.
 * <p/>
 * Subclasses of this base class can be configured to secure incoming and secure outgoing messages. By default, both are
 * on.
 *
*/


Ну и дальше колупаем куда надо поставить такой интерцептор на своих бинах

Добавлено через 11 минут и 46 секунд
Еще нашел такое. В spring-ws дистрибутиве есть самплы. И самый первый из них (airline) как раз и показывает одной из своих функциональностей, как секьюрить сервисы


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


Шустрый
*


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

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



MisterCleric, еще раз спасибо, продолжу ковыряться...
PM MAIL   Вверх
Vladus
Дата 28.5.2009, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



проблема была решена. Кому интересно, вот решение: на серверной стороне дописываем
Код

    <bean id="wsSecurityInterceptor"
          class="org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor">
        <property name="validationCallbackHandler" ref="springSecurityHandler"/>
        <property name="validationActions" value="UsernameToken"/>
    </bean>

    <bean id="springSecurityHandler"
          class="org.springframework.ws.soap.security.wss4j.callback.SpringPlainTextPasswordValidationCallbackHandler">
        <property name="authenticationManager" ref="authenticationManager"/>
    </bean>

    <bean id="authenticationManager" class="org.springframework.security.providers.ProviderManager">
        <property name="providers">
            <bean class="org.springframework.security.providers.dao.DaoAuthenticationProvider">
                <property name="passwordEncoder" ref="passwordEncoder"/>
                <property name="userDetailsService" ref="userHibernateDAO"/>
            </bean>
        </property>
    </bean>

    <bean id="passwordEncoder" class="org.springframework.security.providers.encoding.Md5PasswordEncoder"/>


и в бине маппинга добовляем наш интерсептор
<ref bean="wsSecurityInterceptor"/>

и теперь каждому методу endpoint-a поставим ограничения по правам таким способом: @Secured({"ROLE_SERVER_ADMIN", "ROLE_MAIN_ADMIN", "ROLE_SUPER_ADMIN"})

примерно так. Тема закрыта

Это сообщение отредактировал(а) Vladus - 28.5.2009, 17:42
PM MAIL   Вверх
MisterCleric
Дата 28.5.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Вот и отлично! По-моему это я тебе и говорил...
спасибо за код. Будем знать. smile 


Для закрытия галочку выбери


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


Шустрый
*


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

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



Вообще говоря я провел достаточно много времени, разбираясь с этой задачей, потому было бы честно рассказать про все проблемы, с которыми я столкнулся. Забыл это сделать сразу, сделаю щас, пользуясь случаем:
1) Если у вас фабрика месседжей - axiom, то
    <bean id="messageFactory" class="org.springframework.ws.soap.axiom.AxiomSoapMessageFactory"
          p:soapVersion="SOAP_12"
          p:payloadCaching="true"/>
p:payloadCaching="true" - обязательно нужно ставить true. Вы потеряете в перформансе, но по другому работать не будет.
цитата из дока
Код

     * Setting this to <code>false</code> will increase performance, but also result in the fact that the message
     * payload can only be read once.

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

2)Если вы, как и я, решили использовать Wss4jSecurityInterceptor 
    <bean id="wsSecurityInterceptor"
          class="org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor">
        <property name="validationCallbackHandler" ref="springSecurityHandler"/>
        <property name="validationActions" value="UsernameToken"/>
    </bean>
то обратите внимание, что хендлер для него (SpringPlainTextPasswordValidationCallbackHandler в моем случае - специально для связки ws+security) есть как из пакета wss4j, так и из пакета xwss. Если подставите не тот - будут проблемы. Очень тупая ошибка, но так сразу можно и не заметить. smile 

3) authenticationManager. 
    <bean id="authenticationManager" class="org.springframework.security.providers.ProviderManager">
        <property name="providers">
            <bean class="org.springframework.security.providers.dao.DaoAuthenticationProvider">
                <property name="passwordEncoder" ref="passwordEncoder"/>
                <property name="userDetailsService" ref="userHibernateDAO"/>
            </bean>
        </property>
    </bean>
Энкодер естественно нужно ставить не всегда, только тогда, когда вы храните пароль в базе закодированным
Далее, userDetailsService - необходимо дао, имплементирующее UserDetailsService.

Ну и на закуску. Вот кусочек из моего контекстника для секьюрити
Код

    <authentication-provider user-service-ref='userHibernateDAO'>
        <password-encoder hash="md5"/>
    </authentication-provider>

захотелось мне все упростить и централизировать. Я распарсил данный бин айдией, получил его айдишник - _authenticationManager. Попытался подставить его в wsSecurityInterceptor, в качестве validationCallbackHandler. Все без проблем собралось, томкат запустился не ругаяясь, но аутенфицироваться я так и не смог. В проблеме разбираться не стал, но решил предупредить.

Не повторяйте моих ошибок 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.0478 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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