Я пытаюсь добавить авторизацию Facebook, используя Spring Security в приложении Spring Boot. В настоящее время моя проблема заключается в извлечении данных из принципала.
Вот моя конфигурация безопасности:
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
содержит только имя и идентификатор. Звонок на securityContext.getAuthentication()
возвращает null
.
Более того, если я создам нечто похожее на конечную точку и передам Principal
в качестве параметра, это будет работать. Пример:
@RequestMapping("/user")
public Principal user(Principal principal) {
return principal;
}
principal
будет содержать все необходимые данные.
В этой связи 2 вопроса:
- Почему контекст безопасности не содержит аутентификация?
- Откуда берется
principal
, если он передается в качестве параметра методу?
Так выглядит отладка внутри