我在两个tomcat服务器上分别部署了spring Web服务和一个业务层。 (如问题Spring WS separately deploy web service and bussiness layer中所述)。

业务层只是一个servlet容器,并且Web服务通过httpinvoker与之通信。

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

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

最佳答案

httpinvoker远程处理方式使用http客户端,默认情况下,它将使用JDK中的普通HttpURLConnection。使用哪种连接方式由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 Security Reference Guide。可以在spring-security-remoting依赖项中找到此类。在此依赖性旁边,您需要配置业务层以使用基本身份验证。

09-10 15:14