如何在 Spring Security 3.1 中进行没有身份验证和授权的并发会话控制

Posted

技术标签:

【中文标题】如何在 Spring Security 3.1 中进行没有身份验证和授权的并发会话控制【英文标题】:How to do Concurrent Session Control without authentication and authorization in Spring Secuirty 3.1 【发布时间】:2012-05-01 23:12:59 【问题描述】:

我需要使用 Spring Security 的并发会话控制功能。我需要使登录用户的上一个会话无效(单用户登录)。我不需要身份验证和授权的功能,因为它已经由应用程序使用 Servlet(Filter) 实现了,它调用了调用 dao 层(Hibernate) 的服务层。

请指导我如何在没有身份验证和授权的情况下实现并发会话控制。

谢谢, 巴拉钱达

【问题讨论】:

这不是并发会话控制。 CSC 是指经过身份验证的用户在应用程序中有两个当前会话(因为使用两个浏览器或计算机)。您究竟想在什么时候使当前用户会话无效? 由于在我们的应用程序中完成了身份验证,我尝试将 Spring Security 仅用于 CSC。根据以下答案,我不明白我们需要使用 Spring Authentication 来获取 CSC。 【参考方案1】:

一种选择(hack)是使用 Spring 的预认证功能。即您将在过滤器中执行身份验证并在请求对象上设置一个属性,即用户名。然后,请求将被传递到 Spring 和 Spring,在其中可以启用并发会话控制功能。

但实际上最好的选择是在您的过滤器中实现并发会话控制。您甚至可以从 spring 源代码中“借用”一些代码。

【讨论】:

【参考方案2】:

简短的回答:你不能,除非你重构你的应用程序以完全使用 spring-security。

略长一点的答案:您可以“伪造”Java EE 容器登录(预认证)。这将需要在您的 spring 安全 http 配置中指定从 AbstractPreAuthenticatedProcessingFilter 派生的登录过滤器。例如,您可以将您的请求包装在您的过滤器中并添加一个标头值并使用RequestHeaderAuthenticationFilter,或者您可以编写您自己的从您在您自己的登录过滤器中为请求设置的请求属性中提取主体。结合PreAuthenticatedAuthenticationProvider

回答 #2 稍微长一点:您可以使用一种允许所有类型的设置,您可以像往常一样使用会话并发配置 spring-security,但将所有 URL 的访问权限设置为 permitAll(为 <intercept-url pattern="/*" access="permitAll" />)。但是,您必须基本上实现ConcurrentSessionControlStrategy 在您自己的登录逻辑中所做的事情,才能将会话注册到spring security SessionRegistry。在此过程中,您很可能还会遇到许多其他障碍。

但是请注意,由于 spring-security 基于 servlet filter(不是 Spring MVC 之类的 servlet)工作,因此您需要将自己的登录名重构为过滤器并将其放在链中的 spring 安全过滤器,如果您要结合自己的身份验证逻辑和 spring 安全性。

我的建议是,如果你想利用 spring-security 进行并发会话控制,你真的应该一直在 spring-security 之上构建你的身份验证,而不是一些自定义的 servlet。不要与框架抗争,按预期使用它。或者,根本不使用它。

【讨论】:

感谢您的回答。根据建议,我将使用 Spring Security 进行身份验证。我按照这个链接来实现***.com/questions/2683308/…,因为我们的应用程序是使用(struts+spring+hibernate)开发的......请让我知道我是否应该按照其他方法来实现它。谢谢

以上是关于如何在 Spring Security 3.1 中进行没有身份验证和授权的并发会话控制的主要内容,如果未能解决你的问题,请参考以下文章

spring 3.1 with hibernate 4 with spring security 3.1:如何确保包含所有依赖项以及要包含哪些标签?

如何使用 Spring Security 3.1 以编程方式登录用户

Spring Security 3.1 xsd 和 jars 不匹配问题

Spring security:在 3.1 中,仅针对“GET”请求绕过安全过滤器

spring security 3.1 实现权限控制

在 Spring Security 3.1 中,StandardPasswordEncoder 对密码进行盐渍化最合适的用途是啥?