【问题标题】:Pass authentication info between web service and business layer (Spring, tomcat)在 Web 服务和业务层(Spring、tomcat)之间传递身份验证信息
【发布时间】:2014-05-23 23:25:36
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java spring tomcat spring-ws pre-authentication


    【解决方案1】:

    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 依赖中找到。在此依赖项旁边,您需要将业务层配置为使用基本身份验证。

    【讨论】:

    • 谢谢。如您所述,我已经配置了 Web 服务和业务层。但对于业务服务,我也将其用作基于容器的预身份验证。现在我收到错误消息,因为无法在 [localhost:8081/business-layer/Business]; 访问 HTTP 调用程序远程服务;嵌套异常是 java.io.IOException:没有收到成功的 HTTP 响应:状态码 = 401,状态消息 = [未授权]。对此有什么想法吗?
    • 您应该为业务端配置 BASIC 身份验证,这都可以在 Spring Security 中完成,所以不知道为什么需要基于容器的预身份验证。
    • 感谢 Denium。我终于可以在假期后配置它了。现在它工作正常。但我正在寻找是否有更优雅的方式在 Web 服务和业务层之间共享相同的安全上下文。这样用户就不会获得两次身份验证。
    • 这是个问题,因为?它为用户透明地处理,您不想强制后端使用 Spring Security(如果您使用 tomcats 基本身份验证而不是 Spring Security 怎么办)。如果您的客户端和服务器开始使用不同版本的 Spring Security,它也会中断。您可以使用 SSO 解决方案,以便您可以通过请求传递 SSO 票证,但这会增加很多复杂性。您当前的解决方案既简单又有效。
    猜你喜欢
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 2011-02-19
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    相关资源
    最近更新 更多