Kiedy uzupełnić userId przy POST requestach

0

Tworze REST Api które będzie wykorzystywane przez mój frontend, no i mam request który tworzy zapisuje coś na bazie danych, wraz z ID autora tego czegoś. API jest zabezpieczone przy pomocy JWT, tak więc po każdym wpuszczonym do systemu requescie mogę wyciągnąć dane użytkownika chociażby w taki sposób

@Getter
@AllArgsConstructor
public class CreateStuffRequest {
    private final String stuff;
    private final String userId;
}

@RestController
@RequestMapping("/api/stuff")
@AllArgsConstructor
public class StuffController {

    private final StuffService stuffService;

    @PostMapping
    ResponseEntity<Stuff> createStuff(@RequestBody CreateStuffRequest request) {
        final String userId = SecurityContextHolder.getContext().getAuthentication().getName();
        return ResponseEntity.ok(stuffService.createStuff(new CreateStuffRequest(request.getStuff(), userId)));
    }
}

Pytanie tylko czy takie podejście jest lepsze / gorsze od załatwienia tego po stronie frontendu, czyli wysłania CreateStuffRequest z userId w body? W takim przypadku powinienem chyba i tak po stronie backendu walidować czy podane userId w body == userId w SecurityContext, tak więc i tak będę musiał do tego Contextu sięgnąć.

2

Rozwiązanie z SecurityContextem jest imo jedynym prawidłowym. Nie ufaj nigdy temu co wysyła front.

0

Zdradzę Ci sztuczkę. Dodaj do listy parametrów Principala :) https://www.baeldung.com/get-user-in-spring-security Możesz pominąć przesyłanie userId w requeście, chyba że byś robił jakiś wiedźadmiński endpoint i ustawiał coś za kogoś

0

Tak jak napisał @Charles_Ray, albo jeśli implementowałeś własnego UserDetails to dodaj coś takiego @AuthenticationPrincipal UserDetails user.
Ale ogólnie polecam i tak dodać id i wtedy możesz mieć całe security w jednym miejscu w config filu.
Jest taka metoda withObjectPostProcessor i wtedy mając to id tam możesz sprawdzić czy jest uprawniony ktoś.

0
Charles_Ray napisał(a):

Zdradzę Ci sztuczkę. Dodaj do listy parametrów Principala :) https://www.baeldung.com/get-user-in-spring-security Możesz pominąć przesyłanie userId w requeście, chyba że byś robił jakiś wiedźadmiński endpoint i ustawiał coś za kogoś

Co z testami tego? SecurityContext mogłem owrappować w interface np.

@FunctionalInterface
public interface AuthenticationProvider {
    Optional<String> getLoggedUser();
}

I w testach użyć czegoś takiego

AuthenticationProvider authenticationProvider = () -> Optional.of("testUserId");
1

@AngryProgrammer: Ale co ty chcesz testować Spring Security ?

Tu masz jak pisać integracyjne -> https://www.baeldung.com/spring-security-integration-tests

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0