Как SpringBoot получает текущего пользователя от ReactJS? - PullRequest
0 голосов
/ 23 марта 2019

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

это ReactJS(front-end) код, который вызывает 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'
    });
}

И это код начальной загрузки (back-end), который получает переменные из front-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} во внутренний интерфейс?

1 Ответ

1 голос
/ 24 марта 2019
  • Это пружинная загрузка oauth jwt провайдер + сервер ресурсов и ReactJs как потребитель

enter image description here

  • ReactJ могут потреблять ресурсы сервера (остальные API), отправляя и HTTP-запрос , но сначала он должен получить разрешение для этого (токен)
  • Сервер отправит токен JWT после успешного входа в систему
  • затем, когда реагирующие отправляют HTTP-запрос, он фактически вводит дополнительную информацию в HTTP-запрос, который является авторизационным токеном
  • когда сервер получает этот запрос и до того, как он достигает контроллера , проход запроса отбрасывает цепочку фильтра (пружинная цепочка фильтров безопасности), смотрите в этом методе класса фильтра в коде ссылка после успешной аутентификации пользователя вызов SecurityContextHolder класса заполняет контекст безопасности с помощью текущий аутентифицированный пользователь (Принцип пользователя) и, наконец, когда запрос достигает контроллера , наш контекст безопасности заполнен заполнен
  • @CurrentUser UserPrincipal currentUser, когда вы добавили UserPrincipal currentUser к пружинным Controller методам, он автоматически заполнит объект из контекста, вы можете сделать это самостоятельно вызывая класс 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);
    
     ...
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...