我有以下设置。
server1:我在一个应用程序中使用spring security v3.1.4。此应用程序在其自己的服务器上运行(例如,在server1.mydomain.com上的tomcat)。
server2:我在另一台服务器上运行另一个第三方Web应用程序(例如,在server2.mydomain.com上运行tomcat)。这个应用程序是可插入的,它允许我安装jar以在运行时动态修改行为。它的目的是提供内容。
用户和资源访问在server1上进行管理。内容由server2提供。在server2上,如果有资源请求进来,我需要询问server1用户是否已登录。这可能与spring安全性有关吗?我想我会用资源请求传递用户名(例如http://server2.mydomain.com?getFileId=1&username=johndoe@gmail.com)。
我在春季安全网站上看了一下,SSO似乎是要走的路(例如使用中央认证服务)。但这似乎有点矫枉过正。我们的架构已经运行了几台服务器。如果可能的话,我们希望有一个简约系统(但我们的系统不小,考虑到我们使用rdbms / IR集群的投资和假设)。
任何帮助表示赞赏。
答案 0 :(得分:1)
实现这一目标的一种可能方式 - 虽然这不是我自己尝试过的 - 可能是通过一个简单的基于REST的控制器在server1中公开Spring Security的SessionRegistry
。然后,这将允许server2通过发出简单的HTTP GET请求来远程查询server1中的经过身份验证的用户。
阅读Spring Security文档的Session Management部分以确定如何访问SessionRegistry
可能是值得的。我认为基本设置是在server1上的配置的<session-management>
部分中指定<http>
标记。
<security:session-management>
<security:concurrency-control session-registry-ref="sessionRegistry"/>
</security:session-management>
<bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl"/>
您还需要向server1的web.xml
添加一个侦听器
<listener>
<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>
然后,您需要在server1上创建的控制器可以使用SessionRegistry
@Autowired
private SessionRegistry sessionRegistry
从那里,您可以使用sessionRegistry.getAllSessions()
来确定在对服务器的请求中传递的用户名(主体)是否已登录到server1上。
更多的想法而不是具体的答案 - 但可能会给你一个探索的途径。