在 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 上的漏洞
Spring security:Spring security 如何在 SessionRegistry 中注册新会话?
在使用 Oauth、SAML 和 spring-security 的多租户的情况下从 spring-security.xml 中获取错误