#java #spring-boot #spring-security #api-key
#java #spring-boot #spring-security #api-ключ
Вопрос:
Вопрос: является ли моя реализация безопасной (по стандартам API Key) ИЛИ такой же безопасной, как при использовании Spring Boot Security?
Я создал Spring Boot API, но вместо того, чтобы использовать Spring Boot Security для реализации безопасности ключа Api, я написал свою собственную реализацию ключа API. Ключ API передается как @RequestHeader в каждом «защищенном» запросе (см. «/ booking / cancel» ниже).
Контроллер:
@RequestMapping(value = "/booking/cancel",
consumes = { "application/json" },
method = RequestMethod.POST)
public ResponseEntity<Void> cancelOrder(@RequestBody Cancellation cancellation,
@RequestHeader String apiKey) {
if(apiKey == null) {
return new ResponseEntity<Void>(HttpStatus.NOT_ACCEPTABLE);
}
long bookingProviderId;
try {
bookingProviderId = bookingService.getIdFromApiKey(apiKey);
if (bookingProviderId < 0) {
return new ResponseEntity<Void>(HttpStatus.NOT_ACCEPTABLE);
}
} catch (ApplicationException e) {
e.printStackTrace();
return new ResponseEntity<Void>(HttpStatus.INTERNAL_SERVER_ERROR);
}
//More code here...
}
Уровень обслуживания:
Функция getIdFromApiKey существует на моем уровне обслуживания и вызывает объект Dao. Он возвращает long (Id), который я впоследствии могу использовать для управления доступом в контроллере (например, запретить пользователю отменять чужой заказ).
public long getIdFromApiKey(String apiKey) throws ApplicationException {
return apiKeyDao.selectId(apiKey);
}
Уровень Dao:
public long getApiKey (String apiKey) throws DataAccessException {
BookingProvider bp = jdbcTemplate.queryForObject("SELECT * FROM BookingProvider WHERE apiKey = ?", BeanPropertyRowMapper.newInstance(BookingProvider.class), apiKey);
if(bp == null)
return -1;
else
return bp.getId();
}