【发布时间】:2020-06-02 22:39:23
【问题描述】:
我正在尝试在 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 将包含所有必要的数据。
在这方面,2个问题:
- 为什么安全上下文不包含身份验证?
- 如果
principal作为参数传递给方法,它来自哪里?
这就是调试内部的样子
【问题讨论】:
-
很遗憾,它对我没有帮助。
-
你能放一个调试器或日志吗,我怀疑你甚至进入
extractPrincipal方法
标签: java spring-boot facebook-graph-api spring-security