我在两个tomcat
服务器上分别部署了spring Web服务和一个业务层。 (如问题Spring WS separately deploy web service and bussiness layer中所述)。
业务层只是一个servlet容器,并且Web服务通过httpinvoker
与之通信。
我将基于tomcat容器的身份验证与springs PreAuthenticatedAuthenticationProvider
和J2eePreAuthenticatedProcessingFilter
一起使用。在这里,我没有为客户端应用程序提供任何身份验证令牌。 (我的意思是我没有手动进行任何会话处理。它仅由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
依赖项中找到此类。在此依赖性旁边,您需要配置业务层以使用基本身份验证。