Java 使用spring安全性的会话管理

Java 使用spring安全性的会话管理,java,spring,spring-mvc,session,spring-security,Java,Spring,Spring Mvc,Session,Spring Security,我已经使用UserDetailsService创建了一个基本的spring安全认证,现在我能够验证用户身份。然而,我不明白如何实现以下目标: 用户登录后,当下一个请求出现时,如何以及在何处检查该请求是否来自同一个登录用户或其他登录用户 我知道Spring拦截器的概念,在这里我可以拦截所有传入的请求。但是在SpringSecurity中有什么东西可以做到这一点吗 如何在登录后启动会话并在会话中为该用户存储值 我浏览了现有答案,但大多数示例都是用于登录的 如果有人能给我举个例子,我将不胜感激 编辑:

我已经使用UserDetailsService创建了一个基本的spring安全认证,现在我能够验证用户身份。然而,我不明白如何实现以下目标:

  • 用户登录后,当下一个请求出现时,如何以及在何处检查该请求是否来自同一个登录用户或其他登录用户
  • 我知道Spring拦截器的概念,在这里我可以拦截所有传入的请求。但是在SpringSecurity中有什么东西可以做到这一点吗

  • 如何在登录后启动会话并在会话中为该用户存储值
  • 我浏览了现有答案,但大多数示例都是用于登录的

    如果有人能给我举个例子,我将不胜感激

    编辑:
    我认为我应该使用会话范围的bean来维护用户的会话内容,而不是直接操作httpsession。

    我认为您确实需要花一些时间阅读Spring安全文档以及所有JSP、servlet和MVC体系结构。你有几个误会

  • 在身份验证之后,您不需要启动会话,请求发出时会话已经存在。请记住,
    request.getSession()
    我们从请求中获取会话,我真的不知道还有其他方法,即实例化会话对象并将其分配给请求/响应。验证成功后,spring会在会话中自动设置spring\u SECURITY\u上下文属性,该变量稍后用于确定用户是否已通过验证(spring会为您这样做,您不需要使用该属性)

  • 在spring security中,我们设置了一个身份验证入口点,其中包含有关登录页面url的信息,并设置了表单\u login\u过滤器,其中包含有关登录处理url的信息,登录成功url和登录失败url等。会话没有SPRING\u SECURITY\u上下文和auth属性的每个请求都会被重定向到登录页面url


  • 我可以直接给出代码,但如果您至少阅读几页Spring文档,那就太好了。一旦理解了概念,仍然无法解决问题。使用详细问题编辑您的问题,我们将尝试修复它。

    首先,您需要使用当前的HttpRequest创建一个身份验证对象,如下所示:

     public class SessionService{
    
        public Authentication getSession(HttpServletRequest request) {
            HttpSession session=request.getSession();
            SecurityContext ctx= (SecurityContext) session.getAttribute("SPRING_SECURITY_CONTEXT");
            Authentication auth=ctx.getAuthentication();
            return auth;
        }
    }
    
    然后,您可以通过传递当前HttpRequest从该身份验证对象检索会话详细信息,如下所示:

    Authentication auth = sessionService.getSession(request);
    

    上面的auth对象包含您需要的详细信息。

    您阅读了文档吗?文档非常混乱,而且很多。spring安全参考指南非常清楚如何配置会话管理……它在spring安全文档中。请参阅此处。我查看了这一部分,但是我没有得到一个可以用来获取会话的示例。如果你能指出某些部分,这将是有益的。谢谢你的信息。我知道从请求中获取会话是request.getSession(true),但我认为SpringSecurity可能有一些“其他”方法来实现这一点。。例如:它可能会为我创建一个会话,但我必须使用它。是的,Spring将为您创建一个会话,您可以直接使用它。。找到了另一个有用的链接,这篇文章说“为了安全起见,你不应该直接与HttpSession交互。这样做根本没有理由——总是使用SecurityContextHolder来代替。”但是SecurityContextHolder的代码并没有给我提供可以玩的会话。