我需要使用 Spring Security 的并发会话控制功能。我需要使登录用户的上一个会话无效(单用户登录)。我不需要身份验证和授权功能,因为它已经由应用程序使用 Servlet(Filter) 实现,该应用程序调用调用 dao 层(Hibernate)的服务层。
请指导我如何在没有身份验证和授权的情况下实现并发会话控制。
谢谢, 巴拉尚达尔
我需要使用 Spring Security 的并发会话控制功能。我需要使登录用户的上一个会话无效(单用户登录)。我不需要身份验证和授权功能,因为它已经由应用程序使用 Servlet(Filter) 实现,该应用程序调用调用 dao 层(Hibernate)的服务层。
请指导我如何在没有身份验证和授权的情况下实现并发会话控制。
谢谢, 巴拉尚达尔
一种选择(hack)是使用 Spring 的预身份验证功能。即,您将在过滤器中执行身份验证并在请求对象上设置一个属性,即用户名。然后,请求将被传递到 Spring 和 Spring,在其中可以启用并发会话控制功能。
但实际上最好的选择是在您的过滤器中实现并发会话控制。您甚至可以从 spring 源代码中“借用”一些代码。
简短的回答:除非你重构你的应用程序以完全使用 spring-security,否则你不能。
稍微长一点的答案:您可以“伪造”Java EE 容器登录(预认证)。AbstractPreAuthenticatedProcessingFilter
这将需要指定从您的 spring 安全 http 配置中派生的登录过滤器。例如,您可以将您的请求包装在您的过滤器中并添加一个标头值并使用RequestHeaderAuthenticationFilter
,或者您可以编写自己的从您在自己的登录过滤器中为请求设置的请求属性中提取主体。结合一个PreAuthenticatedAuthenticationProvider
.
稍长的答案#2:您可以使用一种允许所有类型的设置,您可以像往常一样配置带有会话并发的spring-security,但将所有URL(is <intercept-url pattern="/*" access="permitAll" />
)的访问权限设置为permitAll。但是,您必须基本上实现ConcurrentSessionControlStrategy
您自己的登录逻辑中所做的事情,才能将会话注册到 spring securitySessionRegistry
中。在此过程中,您很可能还会遇到许多其他障碍。
但是请注意,由于 spring-security 基于 servlet过滤器(而不是 Spring MVC 之类的 servlet)工作,因此您需要将自己的登录名重构为过滤器,并将其放在链中的 spring 安全过滤器之前,如果您是结合您自己的身份验证逻辑和弹簧安全性。
我的建议是,如果你想利用 spring-security 进行并发会话控制,你应该一路走下去,在 spring-security 而不是一些自定义 servlet 之上构建你的身份验证。不要与框架抗争,按预期使用它。或者,根本不使用它。