【问题标题】:How does spring security maintain authentication information between request?spring security如何维护请求之间的认证信息?
【发布时间】:2019-12-15 03:00:21
【问题描述】:

spring security如何维护请求之间的认证信息?

它是否使用任何类似于 jSessionId 的东西或使用完全不同的机制。

此外,我看到AbstractSecurityInterceptor(我的意思是它的任何实现)负责拦截传入的请求并验证请求是否已经使用Authentication.isAuthenticated() 授权,然后根据条件验证请求或将 Authentication 请求发送到 AuthenticationManager 实现。因此,换句话说,AbstractSecurityInterceptor 如何区分第一个请求和后续请求。

【问题讨论】:

  • 这与 jsessionid cookie 有关,每个请求浏览器将最后一个作为 header parm 发送,然后服务器拦截它并检查它是否经过身份验证、授权或匿名会话(不是这个参数是 ID在服务器中创建会话对象)
  • spring如何保持jsessionid和userdetails之间的映射,哪些类处理这个映射功能。这正是我正在寻找的,因此我可以进一步了解这些课程。
  • 当您登录时,在创建的会话中,安全上下文对象将存储在SPRING_SECURITY_CONTEXT会话密钥中,因此所有安全信息(包括用户详细信息都将存储在那里)。
  • 您也可以在没有会话和没有会话 cookie 的情况下工作,例如如果您使用 JWT。它是由身份提供者发行的令牌。客户端将 JWT 添加到每个请求的 HTTP 标头中。
  • 好吧,jwt 是 gr8...它的有效负载捆绑了整个用户的角色/权限“来回”...所以安全上下文不必费心在内部存储角色...但是我试图理解的用例是基本身份验证......没有 JWT 或 OAuth(至少目前是这样。)

标签: spring spring-boot spring-security spring-session jsessionid


【解决方案1】:

Spring Security 使用SecurityContextRepository 来存储和检索当前安全会话的SecurityContext

默认实现是HttpSessionSecurityContextRepository,它利用javax.servlet.http.HttpSession 来存储/检索SecurityContext

底层 servlet 容器将为传入请求获取正确的HttpSession,这通常是由于在 cookie 或请求参数中传递了会话标识符。对于 Spring Security 来说,这并不重要,因为它会被加载到底层的 servlet 容器中。

【讨论】:

  • gr8。您能否澄清“这无关紧要,因为它已加载到底层 servlet 容器中”。你的意思是spring security不使用像jsessionid这样的会话标识符。
  • 它没有。它使用 servlet-api 并让 servlet 容器(Tomcat、Jetty、Undertow)处理细节。所以 Spring Security 只处理 HttpSession 它是如何创建的,这对 Spring Security 来说并不重要,因为它只使用一个 API。
  • 另外说,我们在浏览器上看到的jsessionid来自ApplicationServer。就像在 servlet 世界中一样,spring security 还处理从 httpsession 对象检索到的详细信息(jsessionid)。在这里,spring 透明地处理它,而不是应用程序代码处理 httpsession。并且应用程序代码不再需要关心 httpsession 并且可以在更高的抽象上工作,即SecurityContext
  • HttpSession 是 servlet API 的一部分。对于 web,Spring 安全性使用 servlet API。它只是在现有 API 之上构建的 Java
  • cookies,作为会话,是 servlet-api 的一部分。
猜你喜欢
  • 2012-03-13
  • 2011-04-20
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
相关资源
最近更新 更多