在 Spring Security 中使用 Oauth2 手动进行身份验证不会在整个会话期间保持 SecurityContext

Posted

技术标签:

【中文标题】在 Spring Security 中使用 Oauth2 手动进行身份验证不会在整个会话期间保持 SecurityContext【英文标题】:Manually authentication in Spring Security with Oauth2 does not persist SecurityContext throughout the session 【发布时间】:2019-11-21 04:05:03 【问题描述】:

我正在使用带有 JWT 的 Spring Security Oauth2 将客户端应用程序登录/授权到授权服务器应用程序,两者都是使用 Spring Boot 2 构建的。

在客户端应用程序中,我手动登录,从授权服务器检索 JWT 令牌,然后在代码中进行操作

OAuth2Authentication authentication = tokenStore.readAuthentication(token);
SecurityContextHolder.getContext().setAuthentication(authentication);

我遇到的问题是我想稍后在应用程序流程中检索令牌,但 SecurityContextHolder.getContext().getAuthentication() 返回 null。这告诉我 SecurityContext 会在某个时候被 Spring 清除。

如何以某种方式使 SecurityContext 在整个会话中保持不变?还是我做错了什么?

我拥有的一些配置的sn-ps:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter 
...
  @Override
  public void configure(HttpSecurity http) throws Exception 
      http.csrf()
      .disable()
      .sessionManagement()
      .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
      .and()
      .authorizeRequests()
      .antMatchers("/login")
      .permitAll()
      .anyRequest()
      .authenticated();
  
...

然后我想稍后在客户端应用程序的流程中检索令牌:

 SecurityContext securityContext = SecurityContextHolder.getContext();
 OAuth2Authentication oauth = (OAuth2Authentication)securityContext.getAuthentication();
 String token = (String) oauth.getCredentials();

但 oauth 对象为空。

【问题讨论】:

【参考方案1】:

您是否在之后创建会话并更新其上下文?

HttpSession session = request.getSession(true);
session.setAttribute("SPRING_SECURITY_CONTEXT", securityContext);

【讨论】:

以上是关于在 Spring Security 中使用 Oauth2 手动进行身份验证不会在整个会话期间保持 SecurityContext的主要内容,如果未能解决你的问题,请参考以下文章

带有 WSO2 身份服务器的 Spring Cloud Security

如何使用带有 WebClient 的 spring-security-oauth2 自定义 OAuth2 令牌请求的授权标头?

无法修复 spring-security-oauth2-resource-server 上的漏洞

带有Angularjs注销错误的Spring Boot

Spring security:Spring security 如何在 SessionRegistry 中注册新会话?

在使用 Oauth、SAML 和 spring-security 的多租户的情况下从 spring-security.xml 中获取错误