Java Spring安全性:服务器启动的会话终止

Java Spring安全性:服务器启动的会话终止,java,session,spring-security,Java,Session,Spring Security,我已经使用SpringSecurity3.1.4开发了一个系统。大多数配置都是现成的 系统的用户在DAO中描述,登录时,AuthenticationProvider的实现为请求提供服务,它在数据库中查找用户并返回UsernamePasswordAuthenticationToken。这在登录时发生一次 然后使用@PreAuthorize注释保护服务器API;例如: @PreAuthorize("hasRole('ROLE_USER') and hasPermission(#order,'crea

我已经使用SpringSecurity3.1.4开发了一个系统。大多数配置都是现成的

系统的用户在DAO中描述,登录时,AuthenticationProvider的实现为请求提供服务,它在数据库中查找用户并返回UsernamePasswordAuthenticationToken。这在登录时发生一次

然后使用@PreAuthorize注释保护服务器API;例如:

@PreAuthorize("hasRole('ROLE_USER') and hasPermission(#order,'createOrder')")
public Response createOrder(Order order)
{
    ...
}
到目前为止,一切顺利;上述安全要求的两个要素都可以正常工作

问题在于管理员用户可以删除其他用户,将其从数据库中删除。发生这种情况时,应该销毁目标用户的会话

这一尝试如下所示:

    List<SessionInformation> sessions = registry.getAllSessions( username, false );
    for ( SessionInformation ses : sessions )
    {
        ses.expireNow();
        registry.removeSessionInformation( ses.getSessionId() );
    }
然而,尽管这段代码找到了一个会话并使其过期,但有问题的用户仍然能够进行进一步的API调用,而不会发生意外。我也尝试过不使用removeSessionInformation行

我看到其他人有这个问题,没有答案,我不知道我能做什么。在我看来,有两种选择:

添加筛选器以捕获每个请求并手动检查其中的会话,或

重新配置系统以使用数据库对每个请求进行身份验证,或

手动实现我自己的会话管理系统

但所有这些似乎都是愚蠢和不必要的,也让我不知道如何完成它们


这不是什么稀奇的问题,有人能解释一下吗?

我也看到了奇怪的现象,但不是你所描述的。如果我调用expireNow,那么所有后续请求将不再被接受。只有在expireNow之前调用的请求才会正常响应。removeSessionInformation似乎没有您所描述的任何效果。请尝试我的答案-我认为它涉及删除“removeSessionInformation”行,但我确信我已经尝试过如上所述。答案中还有更多的东西,所以来个游戏吧。正是因为这个原因——不确定性,我还没有给自己的问题写一个答案。