Использование информации из AuthenticatedPrincipal вместо параметров запроса или переменных пути в REST API - PullRequest
1 голос
/ 11 марта 2020

Все, что я практиковал в профессиональной обстановке, всегда включало наличие идентификатора, связанного с сущностью, будь то фактический идентификатор пользователя или идентификатор ресурса, и иногда оба они передаются в конечную точку в качестве запроса параметр или переменная пути. В большинстве случаев это казалось контрпродуктивным, потому что пользователь должен был уже проходить аутентификацию через защитный фильтр пружины и иметь соответствующую роль, прежде чем даже попасть внутрь конечной точки. Затем, попав внутрь конечной точки, мы сделаем еще одну проверку, чтобы убедиться, что идентификатор, который был передан в качестве параметра запроса или переменной пути, совпадает с идентификатором, который был у аутентифицированного пользователя ... все это будет выглядеть примерно так:

    @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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...