Передача информации об аутентификации между веб-сервисом и бизнес-уровнем (Spring, tomcat)

У меня есть весенний веб-сервис и бизнес-уровень, развернутый отдельно на двух tomcat сервера. (Как поясняется в вопросе Spring WS, отдельно разверните веб-сервис и бизнес-слой).

Бизнес-уровень - это просто контейнер сервлета, а веб-сервис связывается с ним весной httpinvoker,

Я использую аутентификацию на основе контейнера Tomcat с пружинами PreAuthenticatedAuthenticationProvider а также J2eePreAuthenticatedProcessingFilter, Здесь я не предоставляю клиентскому приложению токен аутентификации. (Я имею в виду, что я не делаю никакой обработки сеанса вручную. Он управляется только tomcat)

Теперь я хочу убедиться, что запросы к моим бизнес-уровням поступают от аутентифицированного клиента. Одна вещь, которую я нашел, это передать Authentication объект, который я получаю из контекста безопасности веб-службы как SecurityContextHolder.getContext().getAuthentication() в качестве параметра запроса для бизнес-уровня. Но там у меня нет способа проверить, что Authentication объект. Так есть идеи о том, как добиться безопасности на уровне моего бизнеса?

1 ответ

Решение

В способе удаленного взаимодействия httpinvoker используется http-клиент, по умолчанию он использует простой HttpURLConnection из JDK. Какой способ подключения используется, определяется реализацией HttpInvokerRequestExecutor который по умолчанию является SimpleHttpInvokerRequestExecutor,

Теперь вы можете переключиться на использование одной из других реализаций, использующих Apache Commons HttpClient. Затем вы можете использовать BASIC-аутентификацию (или дайджест), чтобы передать имя пользователя / пароль на сервисный уровень (вместо Authentication объект.

Spring Security уже предоставляет эту пользовательскую реализацию для вас, поэтому в основном единственное, что вам нужно сделать (на стороне клиента), это перенастроить HttpInvokerProxyFactoryBean,

<bean id="yourServiceProxy" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
    <property name="httpInvokerRequestExecutor" ref="requestExecutor" />
</bean>

<bean id="requestExecutor" class="org.springframework.security.remoting.httpinvoker.AuthenticationSimpleHttpInvokerRequestExecutor"/>

См. Также Javadoc и Справочное руководство по безопасности Spring. Этот класс можно найти в spring-security-remoting зависимость. Рядом с этой зависимостью вам нужно настроить бизнес-уровень на использование базовой аутентификации.

Другие вопросы по тегам