2013-01-06 68 views
0

我有一个使用基本身份验证与Spring Security进行安全保护的SOAP Web服务。Spring Security注销和独立应用程序

我写了一个Swing应用程序来访问这个Web服务。当应用程序启动时,登录对话框出现在用户输入其凭证的地方。当用户单击“登录”按钮时,将使用给定的凭证创建JAXWS客户端。我也想给登录用户注销的可能性。 Spring Security需要访问URL才能注销。这在独立应用程序中如何工作?这应该通过CXF还是使用简单的HTTP客户端来完成?

回答

0

这并不重要,你如何实现这一点。唯一的要求是创建HTTP GET来注销URL,但您的请求应包含会话的会话ID。否则,Spring无法知道哪个会话无效。所以,我认为最简单的方法就是使用你当前使用的同一个客户端。

+0

谢谢您的回答。我使用JaxWsProxyFactoryBean来创建我用来调用我的Web服务方法的代理。是否有可能通过代理获取注销URL? –

+0

@MickaelMarrache,你确定JAX客户端会缓存会话cookie吗? –

+0

@ Michael-O我认为JAX客户端会缓存JSESSIONID cookie,因为这是我从登录到登出时使用的客户端。此外,我已将BindingProvider.SESSION_MAINTAIN_PROPERTY属性设置为true。 –

1

完全避免会话并让您的JAXClient在每个连接请求上重新进行身份验证。使用Spring Security 3.1提供的stateless配置您的secuity.xml。

+0

很明显,无状态时它更容易,但我想限制每个用户的应用程序的一个连接实例(使用Spring Security的并发控制功能,但只有在服务维护会话时此功能才相关)。我会考虑这种可能性。您是否知道如何配置客户端以对每个请求重新进行身份验证? –

+0

然后限制同一主机上启动的Swing客户端的数量。 –

+0

@MarcelStör问题是不同的。例如,如果用户与其他用户共享其凭据。每个用户可以在他的主机上运行一个客户端实例,都使用相同的凭据。这就是我想要避免的。 –

0

好吧,我不会争论有状态与无状态。如果您需要从Swing应用程序注销,则只需将HTTP GET请求发送到配置的注销URL,并沿其发送会话ID。你甚至都不需要Apache的HttpClient此:

String url = "http://example.com/logout"; 
String charset = "UTF-8"; 
String session = ";jsessionid=" + sessionId; 
URLConnection connection = new URL(url + session).openConnection(); 
connection.setRequestProperty("Accept-Charset", charset); 
InputStream response = connection.getInputStream(); 
// ... 

https://stackoverflow.com/a/2793153/131929(射击练习一个HTTP GET请求)了解详情。

您可以附加到会话ID直接将URL如上图或将其作为一个普通饼干头,像这样:

connection.addRequestProperty("Cookie", "JSESSIONID=" + sessionId); 
+0

感谢您的回答,这是我正在寻找的,但会话ID是作为cookie发送的,我可以从CXF的HTTPConduit获得,但是我没有看到会话ID作为查询参数发送。 –

+0

这不是一个查询字符串参数(对不起,更正了我的代码),而是一个不支持cookie的用户代理的特殊机制,例如如果你在浏览器中禁用cookies。见例如详情请参阅http://javarevisited.blogspot.ch/2012/08/what-is-jsessionid-in-j2ee-web.html。但是,我添加了有关如何设置会话ID cookie的说明。 –