Java 在web服务和业务层(Spring、tomcat)之间传递身份验证信息

Java 在web服务和业务层(Spring、tomcat)之间传递身份验证信息,java,spring,tomcat,spring-ws,pre-authentication,Java,Spring,Tomcat,Spring Ws,Pre Authentication,我在两台tomcat服务器上分别部署了springweb服务和业务层。(如问题所述) 业务层只是一个servlet容器,web服务与之通信springhttpinvoker 我将基于tomcat容器的身份验证与springsPreAuthenticatedAuthenticationProvider和J2eePreAuthenticatedProcessingFilter一起使用。在这里,我不向客户端应用程序提供任何身份验证令牌。(我的意思是我没有手动执行任何会话处理。它仅由tomcat管理)

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

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

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


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

远程处理的httpinvoker方法使用http客户端,默认情况下,它将使用来自JDK的普通
HttpURLConnection
。使用哪种连接方式取决于
HttpInvokerRequestExecutor
的实现,默认情况下,它是
simplehttppinvokerrequestexecutor

现在,您可以切换到使用其他实现之一,这些实现在后台使用ApacheCommonsHttpClient。然后,您可以使用基本身份验证(或摘要)将用户名/密码传递给服务层(而不是
身份验证
对象)

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"/>


另请参见和Spring Security。此类可在
Spring Security remoting
依赖项中找到。在该依赖项旁边,您需要配置您的业务层以使用基本身份验证。

谢谢。我已配置了您提到的web服务和业务层。但对于业务服务,我也使用了它s基于容器的预身份验证。现在我收到错误,因为无法访问位于[;嵌套异常为java.io.IOException:未收到成功的HTTP响应:状态代码=401,状态消息=[未经授权].有什么想法吗?你应该让业务端配置基本身份验证,这都可以在Spring Security中完成,所以不确定为什么你需要基于容器的预身份验证。谢谢Denium。我终于可以在假期后配置它了。现在它可以正常工作了。但我正在寻找是否有更优雅的方式来共享web服务和业务层之间具有相同的安全上下文。因此用户不会获得两次身份验证。这是一个问题,因为它是为用户透明处理的,您不想强制后端使用Spring安全性(如果您使用tomcats基本身份验证而不是Spring安全性怎么办)。如果您的客户端和服务器开始使用不同版本的Spring Security,它也会崩溃。您可以使用SSO解决方案,以便在请求中传递SSO票证,但这会增加很多复杂性。您当前的解决方案很简单,可以正常工作。