Все, что я практиковал в профессиональной обстановке, всегда включало наличие идентификатора, связанного с сущностью, будь то фактический идентификатор пользователя или идентификатор ресурса, и иногда оба они передаются в конечную точку в качестве запроса параметр или переменная пути. В большинстве случаев это казалось контрпродуктивным, потому что пользователь должен был уже проходить аутентификацию через защитный фильтр пружины и иметь соответствующую роль, прежде чем даже попасть внутрь конечной точки. Затем, попав внутрь конечной точки, мы сделаем еще одну проверку, чтобы убедиться, что идентификатор, который был передан в качестве параметра запроса или переменной пути, совпадает с идентификатором, который был у аутентифицированного пользователя ... все это будет выглядеть примерно так:
@PostMapping("/do-something")
@Secured(RoleType.Names.SOME_ROLE)
public ResponseEntity addNewClient(@RequestParam final String id)
{
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
MyCustomPrincipal loggedInUser = (MyCustomPrincipal) authentication.getPrincipal();
final String authenticatedId = loggedInUser.getUser().getId();
if(!authenticatedId.equals(id))
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
// Make some service call and do/get something for the id provided
return ResponseEntity.ok().build();
}
Однако сейчас я работаю над собственным проектом и настроил вещи, в которых мой пользовательский принципал, который реализует UserDetails, может быть передан как таковой, и я действительно пытаюсь выяснить, что было бы цель принуждения моих конечных точек включать идентификатор в качестве параметра запроса или переменной пути в ситуациях, когда мне нужен идентификатор аутентифицированного пользователя, как описано выше. Есть ли что-то, чего я упускаю, или не рекомендуется просто извлекать эту информацию у аутентифицированного пользователя? Я считаю, что это сделало бы мои конечные точки и код более чистыми, но я не хочу go против лучших практик.
@PostMapping("/do-something")
@Secured(RoleType.Names.SOME_ROLE)
public ResponseEntity addNewClient(@AuthenticationPrincipal MyCustomPrincipal principal)
{
final String id = principal.getUser().getId();
// Make some service call and do/get something for the id provided
return ResponseEntity.ok().build();
}