Передача информации об аутентификации между веб-сервисом и бизнес-уровнем (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
зависимость. Рядом с этой зависимостью вам нужно настроить бизнес-уровень на использование базовой аутентификации.