2

我在两台tomcat服务器上分别部署了 Spring Web 服务和业务层。(如问题Spring WS 分别部署 Web 服务和业务层中所述)。

业务层只是一个 servlet 容器,web 服务与它通信 spring httpinvoker

我将基于 tomcat 容器的身份验证与 springsPreAuthenticatedAuthenticationProviderJ2eePreAuthenticatedProcessingFilter. 在这里,我不向客户端应用程序提供任何身份验证令牌。(我的意思是我没有手动进行任何会话处理。它仅由 tomcat 管理)

现在我想确保对我的业务层的请求来自经过身份验证的客户端。我发现的一件事是将Authentication我从 Web 服务的安全上下文中获得的对象SecurityContextHolder.getContext().getAuthentication()作为请求参数传递给业务层。但是我没有办法验证该Authentication对象。那么关于在我的业务层实现安全性的方法有什么想法吗?

4

1 回答 1

3

httpinvoker 远程处理方式使用 http 客户端,默认情况下,它将使用HttpURLConnectionJDK 中的纯文本。使用哪种连接方式HttpInvokerRequestExecutor由默认情况下的实现决定SimpleHttpInvokerRequestExecutor

现在您可以切换到使用在后台使用 Apache Commons HttpClient 的其他实现之一。然后,您可以使用 BASIC 身份验证(或摘要)将用户名/密码传递给服务层(而不是Authenticationobject.

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 Security参考指南。这个类可以在spring-security-remoting依赖中找到。在此依赖项旁边,您需要将业务层配置为使用基本身份验证。

于 2014-04-10T10:24:51.797 回答