如何使用Spring Security从另一个WebApp登录用户



我有以下设置。

server1:我在一个应用程序中使用了Spring Security v3.1.4。此应用程序正在自己的服务器上运行(例如tomcat at Server1.mydomain.com)。

server2:我还有另一个在其他服务器上运行的第三方Web应用程序(例如tomcat at Server2.mydomain.com)。该应用程序可插入,因为它允许我安装JARS在运行时动态修改行为。它的目的是提供内容。

在Server1上管理用户和资源访问。内容由Server2传递。在Server2上,如果资源请求进来,我需要询问Server1是否登录了用户。这可以使用Spring Security吗?我想我会通过资源请求传递用户名(例如http://server2.mydomain.com?getFileid=1& username = johndoe@gmail.com)。

我在Spring Security网站上阅读了一点,SSO似乎是理想的选择(例如,使用中央身份验证服务)。但这似乎是个过度杀伤力。我们的体系结构已经运行了多个服务器。

  • 集成(例如,使用Spring Security的WebApp)
  • 媒体(例如第三方WebApp)
  • 弹性搜索(群集)
  • mysql(群集)
如果可能

任何帮助将不胜感激。

实现这一目标的一种可能方法 - 尽管这不是我自己尝试的东西 - 可能是通过简单的基于REST的控制器将Spring Security的SessionRegistry在Server1中曝光。然后,这将允许Server2通过简单的http获取请求来远程查询Server1中的经过身份验证的用户。

可能值得阅读Spring Security文档的会话管理部分,以确定如何访问SessionRegistry。我认为的基本设置是在您在Server1上的<http>部分中指定<session-management>标签。

<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()来确定在请求中传递给控制器的用户名(principal)是否已在Server1上登录。

更多的想法而不是具体的答案 - 但可以给您探索的途径。

最新更新