Как SpringBoot получает текущего пользователя из ReactJS?

Я пытаюсь понять коды веб-приложения Full-stack на https://github.com/callicoder/spring-security-react-ant-design-polls-app но я не понимаю, как spring-boot знает, какой текущий пользователь входит в систему.

это код ReactJS (внешний интерфейс), который вызывает API.

export function getUserCreatedPolls(username, page, size) {
    page = page || 0;
    size = size || POLL_LIST_SIZE;

    return request({
        url: API_BASE_URL + "/users/" + username + "/polls?page = " + page + "&size = " + size,
        method: 'GET'
    });
}

И это код spring-boot (back-end), который получает переменные от внешнего интерфейса.

@GetMapping("/users/{username}/polls")
public PagedResponse<PollResponse> getPollsCreatedBy(@PathVariable(value = "username") String username,
                                                     @CurrentUser UserPrincipal currentUser,
                                                     @RequestParam(value = "page", defaultValue = AppConstants.DEFAULT_PAGE_NUMBER) int page,
                                                     @RequestParam(value = "size", defaultValue = AppConstants.DEFAULT_PAGE_SIZE) int size) {
    return pollService.getPollsCreatedBy(username, currentUser, page, size);
}
  1. как spring-boot получает {UserPrincipal currentUser} из внешнего интерфейса?
  2. как ReactJs отправляет {UserPrincipal currentUser} на сервер?
0
0
787
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • Это весенняя загрузка oauth jwt провайдер + сервер ресурсов и ReactJs как потребитель

  • ReactJs может потреблять ресурсы сервера (остальные API), отправляя и HTTP-запрос, но сначала он должен получить авторизацию для этого (токен)
  • Сервер отправит Токен JWT после успешного входа в систему.
  • затем, когда реакции отправляют HTTP-запрос, он фактически вводит дополнительную информацию в HTTP-запрос, который является токен авторизации
  • когда сервер получает этот запрос, а перед ним добраться до контроллера, запрос передает цепь фильтра (весенняя цепочка фильтров безопасности), посмотрите на этот метод класса фильтра в коде связь, после того, как успешная аутентификация пользователя вызывает класс SecurityContextHolder для заполнить контекст безопасности с текущий аутентифицированный пользователь (принцип пользователя ), и, наконец, когда запросдобраться до контроллера, наш контекст безопасности равен заполнен
  • @CurrentUser UserPrincipal currentUser , когда вы добавили параметр UserPrincipal текущий пользователь в методы Spring Контроллер, он автоматически заполнит объект из контекста, вы можете сделать это самостоятельно, вызвав класс SecurityContextHolder и получить текущий аутентифицированный пользователь

     ...
    
     // Get The Jwt token from the HTTP Request
     String jwt = getJwtFromRequest(request);
     // Check The validation of JWT - if true the user is trusted
     if (StringUtils.hasText(jwt) && tokenProvider.validateToken(jwt)) {
      Long userId = tokenProvider.getUserIdFromJWT(jwt);
    
      /*
          Note that you could also encode the user's username and roles inside JWT claims
          and create the UserDetails object by parsing those claims from the JWT.
          That would avoid the following database hit. It's completely up to you.
       */
      // Get the user object
      UserDetails userDetails = customUserDetailsService.loadUserById(userId);
      UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
      authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
      // Fill the security context with this user 
      SecurityContextHolder.getContext().setAuthentication(authentication);
    
     ...
    

Другие вопросы по теме