Аутентификация в SecurityContextHolder.getContext () является нулевой; - PullRequest
2 голосов
/ 18 февраля 2020

Я пытаюсь добавить авторизацию 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 вопроса:

  1. Почему контекст безопасности не содержит аутентификация?
  2. Откуда берется principal, если он передается в качестве параметра методу?

Так выглядит отладка внутри

enter image description here

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Этот ответ, вероятно, немного запоздал, но я на самом деле один из первых, потому что у меня была очень похожая проблема. Я обнаружил, что, хотя SecurityContextHolder.getContext() равно никогда null, содержащаяся в нем аутентификация очищается после завершения запроса. Это означает, что если вы попытаетесь получить к нему доступ во время процесса, который проходит через пружинную веб-систему безопасности , он будет там . Но как только запрос завершается, регистрируется следующее:

SecurityContextHolder теперь очищается, так как обработка запроса завершена

и аутентификация установлена ​​на ноль. Любые попытки получить к нему доступ напрямую через SecurityContext вне http-запроса приведут к null .

0 голосов
/ 19 февраля 2020

Аутентификация аутентификации = SecurityContextHolder.getContext (). GetAuthentication (); authentication.getPrincipal ();

использовать вложенный вызов для получения объекта аутентификации, а затем getPrincipal (); вернет текущие данные авторизованного пользователя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...