Передача полномочий и пользователя-участника с rest-клиента на сервер spring boot

#java #spring-boot #spring-security #resttemplate #rest-client

#java #весенняя загрузка #spring-безопасность #resttemplate #rest-клиент

Вопрос:

Я должен вызвать одну защищенную конечную точку с rest-клиента, и на стороне контроллера требуется, чтобы информация о полномочиях и пользователе-принципале была отправлена с клиента.

  String  endpoint="http://localhost:8096/polygons/34";
           // endpoint="https://dop-int.edosdp.ericsson.se/polygon-manager/polygons/34";
            HttpHeaders headers = new HttpHeaders();
            headers.setBasicAuth("mahi", "ChangeM6");
            headers.setConnection("keep-alive");       
             HttpEntity<String> httpEntity = new HttpEntity<String>(headers);       
            ResponseEntity<Long> exchange = restTemplate.exchange(endpoint,HttpMethod.GET, httpEntity, Long.class);    
  

как можно отправить хотя бы одну информацию о роли (ADMIN или GUEST_USER) от клиента.
Есть ли какой-либо способ, которым я могу обернуть всю информацию о пользователе в фиктивный сеанс и отправить ее в serer.

Спасибо, Махи

Ответ №1:

Нет! Для клиента плохая идея изменять любую информацию о сеансе, включая файлы cookie. Это должно быть разрешено только серверу.

Поскольку ваше требование заключается в проверке роли пользователя по определенному URL, вы можете установить пользовательский заголовок запроса и проверить его в самом методе контроллера:

Пример кода:

 @GetMapping("/polygons")
public String getPolygons(HttpServletRequest request) {     
    String userRole = request.getHeader("user-role");
    if(userRole != null amp;amp; userRole.toLowerCase().equals("admin")) {
        System.out.print("Role provided: "   userRole);     
        // ...
        return "some-data";
    }           
    
    System.out.print("Role not provided!");
    return "error";
}
  

Клиент Postman - настраиваемый заголовок

Вы также можете установить роль пользователя в теле запроса для запроса post.

 public class RequestParams {
    private String userRole;
    // ...
}       

@PostMapping("/polygons")
public String getPolygons(@RequestBody RequestParams requestParams) {
    String userRole = requestParams.getUserRole();
    if(userRole != null amp;amp; userRole.toLowerCase().equals("admin")) {
        System.out.print("Role provided: "   userRole);     
        // ...
        return "some-data";
    }           
    
    System.out.print("Role not provided!");
    return "error";
}
  

Установить тело запроса POST

Если вам требуется проверить роль пользователя на нескольких URL-адресах, вам следует подумать о написании фильтра сервлетов.

Редактировать:

Я думаю, что я тоже сталкивался с подобной ситуацией в прошлом. В итоге я использовал библиотеку httpclient от apache вместо resttemplate.

Вот несколько примеров кода:

 private List<OrganizationDTO> getUserOrgUnits(String loggedInUserId, String token) {
    List<OrganizationDTO> userList = new ArrayList<OrganizationDTO>();      

    CloseableHttpClient httpClient = HttpClients.createDefault();
    HttpGet httpGet = new HttpGet(getUserOrgUnitsApiURL());
    try {
        // Setting header
        httpGet.setHeader("Authorization", "Bearer "   token);
        httpGet.setHeader("Content-type", "application/json");
        // Setting custom header
        httpGet.setHeader(USERID_HEADER_NAME, loggedInUserId);
        
        CloseableHttpResponse response = httpClient.execute(httpGet);
        String  result = EntityUtils.toString(response.getEntity());
        
        JsonNode node = null;
        ObjectMapper mapper = new ObjectMapper();
        node = mapper.readTree(result);
        Iterable<JsonNode> list = node.path("data");            
        for (JsonNode jsonNode : list) {
            OrganizationDTO dto = mapper.treeToValue(jsonNode, OrganizationDTO.class);
            userList.add(dto);
        }
    } catch (Exception e) {
        log.error("getUserOrgUnits: Exception.");
        e.printStackTrace();
    }                                       
    return userList;
}
  

Комментарии:

1. Привет, naveenkumashi спасибо за ваш ответ, на самом деле мне нужно настроить роль по умолчанию на стороне клиента для аутентификации, а с помощью httpheaders и resttemplate я не могу передать роль пользователя с клиента на сервер

2. Я обновил свой ответ решением с использованием библиотеки httpclient, а не с использованием resttemplate. Я не думаю, что ваши требования могут быть выполнены с помощью restemplate.