#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";
}
Вы также можете установить роль пользователя в теле запроса для запроса 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";
}
Если вам требуется проверить роль пользователя на нескольких 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.