gpt4 book ai didi

spring-security - 自定义 ConcurrentSessionControlStrategy

转载 作者:行者123 更新时间:2023-12-04 04:54:48 25 4
gpt4 key购买 nike

我正在使用 spring-security 3.1。

我必须以用户指定最大 session 数的方式实现 session 并发策略。这是我所做的:

编码一个类扩展
org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy 并覆盖该方法
protected int getMaximumSessionsForThisUser(Authentication authentication)
我使用命名空间配置对其进行了配置:

<security:http>
...
<security:session-management session-authentication-strategy-ref="mySessionAuthenticationStrategy"/>
...
</security:http>

<bean id="mySessionAuthenticationStrategy" class="foo.bar.MySessionAuthenticationStrategy">
<constructor-arg ref="sessionRegistry"/>
</bean>

<bean id="sessionRegistry"
class="org.springframework.security.core.session.SessionRegistryImpl" />

问题是“MySessionAuthenticationStrategy”从未被调用:(

我在 spring api 中挖掘了以下行(70)在 SessionManagementFilter为假(阻止任何 SessionAuthenticationStrategy 被调用):
if (!securityContextRepository.containsContext(request))

为什么?
我阅读了他们建议在 UsernamePasswordAuthenticationFilter 中设置 session 身份验证策略的文档。 ,但这不是我的选择,因为我将表单登录与 SAML 登录以及 PreAuthentication 结合使用。验证身份验证 token 的机制(3 种不同的身份验证机制)。

你们中的任何人都可以帮忙吗?

最佳答案

简短回答(这是一个猜测):问题可能是您的预身份验证过滤器(或其他非表单登录过滤器)创建了一个 session ,而不会自行调用 SessionAuthenticationStrategy首先。

详细解释:line you mentioned基本上是在没有 auth-filter 创建新 session 的情况下检查请求是否刚刚在过滤器链的当前执行中通过了身份验证。该检查检查是否存在 session ,以及身份验证对象是否已保存到 session 中。

如果它找到 session 和保存的 auth 对象,那就意味着什么都不用做:关于身份验证和 session 管理的一切都已经通过其他过滤器或相同的 SessionManagementFilter 进行了安排。在处理同一 session 中较早的先前请求期间。

另一种情况是尚未创建 session 或(非匿名)身份验证对象尚未保存在现有 session 中。只有在这种情况下才是 SessionManagementFilter通过调用 SessionAuthenticationStrategy 来实际执行 session 管理的责任.

根据你的描述,第二种情况永远不会发生,这意味着 session 已经创建,并且在这个执行点已经保存了auth对象。这应该意味着您的自定义身份验证过滤器必须创建了一个 session ,这本身不是问题。然而,一般规则是任何创建 session 的人都必须首先查阅 SessionAuthenticationStrategy本身。如果您的身份验证过滤器选择忽略它,SessionManagementFilter 将无能为力。 (它无法撤消 session 创建,即使 SessionAuthenticationStrategy 已否决用户的身份验证)。

仔细检查是否是这种情况,并尽量避免在预认证过滤器中创建 session 。请注意, session 创建也可以通过 SaveToSessionResponseWrapper.saveContext() 以一种偷偷摸摸的方式发生。被称为例如在重定向时。

关于spring-security - 自定义 ConcurrentSessionControlStrategy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16903373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com