3

我有一个 Swing 客户端和一个在 tomcat 7 上运行的服务器,它们使用 Spring (3.1) HTTP 调用程序相互通信。到目前为止,通信工作正常(即使使用 TSL),但现在我正在尝试添加 Spring Security。

旁注:在典型的 Web 应用程序中,我将使用基本身份验证来验证用户身份。在我的 CustomAuthenticationProvider 为用户返回一个 Authentication 对象后,一切都“正常工作”,这意味着在每个进一步的请求中,SecurityContext 都会自动设置。我猜登录会向客户端返回一个会话密钥,该密钥会在每个请求上发送以识别会话。

这几乎就是我正在寻找的 HTTP-Invoker。目前,我似乎在每个请求上都获得了一个新的上下文,这很糟糕,因为我的 customAuthenticationManager.authenticate(Authentication auth) 方法非常昂贵,并且每个用户会话实际上应该只调用一次。

任何的想法?

编辑我在http://forum.springsource.org/showthread.php?10764-Maintaing-State-while-using-HttpInvoker找到了一些提示,但是由于这个链接已经超过 8 年了,我希望有一个更容易的解决方案。

4

1 回答 1

3

我现在找到了解决方案。首先,您需要知道 spring-security 部分与 Web 应用程序中的部分完全相同(这很棒)。

在客户端,您需要更复杂的 HTTP 客户端实现。我用过org.springframework.remoting.httpinvoker.HttpComponentsHttpInvokerRequestExecutor。在服务器端,您可以使用create-session="always"-element 的<http-Attribute 来确保始终创建会话。但是,我发现自己创建会话更好(只需调用 httpServletRequest.getSession() ,如果不存在则创建会话),因为这样您可以指定何时执行此操作。就我而言,仅当身份验证成功时,我才会在我的 authenticationProvider 中创建会话。

于 2012-03-07T07:38:43.593 回答