Kiedy uzupełnić userId przy POST requestach

Kiedy uzupełnić userId przy POST requestach
AP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 165
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

Kopiuj
@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ąć.

BP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 53
2

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

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1909
1

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ś

nowyworek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: świat
  • Postów: 174
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ś.

AP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 165
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.

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

I w testach użyć czegoś takiego

Kopiuj
AuthenticationProvider authenticationProvider = () -> Optional.of("testUserId");
Schadoow
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1082
1

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

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.