gpt4 book ai didi

java - SecurityContextHolder.getContext()上的身份验证为null;

转载 作者:行者123 更新时间:2023-12-03 11:18:17 26 4
gpt4 key购买 nike

我正在尝试在Spring Boot应用程序中使用Spring Security添加Facebook授权。目前,我的问题是从Principal提取数据。

这是我的安全配置:

public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure (HttpSecurity http) throws Exception {
http
.csrf().disable()
.antMatcher("/**")
.authorizeRequests()
.antMatchers("/", "/login**").permitAll()
.anyRequest().authenticated()
.and()
.logout()
.deleteCookies("JSESSIONID")
.clearAuthentication(true)
.logoutSuccessUrl("/").permitAll();
}

@Bean
public PrincipalExtractor facebookPrincipalExtractor(){
return new FacebookPrincipalExtractor();
}
}

和主要提取器:
public class FacebookPrincipalExtractor implements PrincipalExtractor {

@Autowired
UserService userService;

@Override
public Object extractPrincipal(Map<String, Object> map) {
String name = (String) map.get("name");
String id = (String) map.get("id");
User user = userService.findOne(id);
if (user == null) {
SecurityContext securityContext = SecurityContextHolder.getContext();
Authentication authentication = securityContext.getAuthentication();
String token = ((OAuth2AuthenticationDetails) authentication.getDetails()).getTokenValue();
user = new User();

FacebookClient facebookClient = new DefaultFacebookClient(token, Version.VERSION_2_10);

JSONObject object = facebookClient.fetchObject("me", JSONObject.class);
// userService.createUser(object);
}
return user;
}
}

登录后, Map<String, Object> map仅包含名称和ID。调用 securityContext.getAuthentication()将返回 null

而且,如果我创建类似于端点的内容并将 Principal作为参数传递到那里,那么它将起作用。例子:
@RequestMapping("/user")
public Principal user(Principal principal) {
return principal;
}
principal将包含所有必要的数据。

在这方面,有两个问题:
  • 为什么安全上下文不包含身份验证?
  • 如果将principal作为参数传递给方法,它将从何而来?


  • 这是内部调试的样子

    enter image description here

    最佳答案

    尽管SecurityContextHolder.getContext()绝不为null,但一旦完成请求,其包含的身份验证将被清除。这意味着,如果您尝试在通过Spring Web安全性的过程中访问它,它将在中。但是,一旦请求完成,就会记录以下内容

    SecurityContextHolder now cleared, as request processing completed


    并将身份验证设置为null。任何在http请求之外直接通过SecurityContext访问它的尝试都将为null。

    关于java - SecurityContextHolder.getContext()上的身份验证为null;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60288854/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com