Przesyłanie z kontrolera do serwisu ID zalogowanego użytkownika

0

Niektóre metody kontrolera, takie jak usuwanie wiadomości, są dostępne tylko dla zalogowanych użytkowników. W kontrolerze wywołuję metodę usuwania wiadomości (kontroler dostępny tylko dla zalogowanych użytkowników)

    @PreAuthorize("hasRole('ROLE_USER')")
    @DeleteMapping(value = "/sent/{id}")
    public
    void deleteMessageSent(
            @ApiParam(value = "The message ID", required = true)
            @PathVariable("id") final String id
    ) {
        this.messagePersistenceService.deleteMessageSent(id, this.authorizationService.getUserId());
    }

Do metody deleteMessageSent serwisu messagePersistenceService przesyłam oprócz ID wiadomości, to również ID zalogowanego użytkownika uzyskane z serwisu authorizationService. Następnie dzięki ID zalogowanego użytkownika mogę usunąć wiadomość

    @Override
    public void deleteMessageSent(
            @NotBlank final String messageId,
            @NotBlank final String userId
    ) throws ResourceNotFoundException {
        ...//usuwanie wiadomości
    }

Jednak tak zastanawiam się, czy jest to bezpieczny sposób. Czy przesyłanie ID użytkownika zalogowanego z kontrolera za każdym razem, gdy mamy do czynienia z kontrolerem dostępnym tylko dla zalogowanych jak np. wysyłanie wiadomości, dodawanie itd. jest bezpieczne. Jest możliwość, aby przenieść authorizationService do samego serwisu np. deleteMessageSent. I wtedy w kontrolerze wysyłałoby się tylko ID wiadomości

    @PreAuthorize("hasRole('ROLE_USER')")
    @DeleteMapping(value = "/sent/{id}")
    public
    void deleteMessageSent(
            @ApiParam(value = "The message ID", required = true)
            @PathVariable("id") final String id
    ) {
        this.messagePersistenceService.deleteMessageSent(id);
    }

a w metodzie serwisu dopiero uzyskiwałbym ID zalogowanego użytkownika

    @Override
    public void deleteMessageSent(
            @NotBlank final String messageId
    ) throws ResourceNotFoundException {
        final Long userId = this.authorizationService.getUserId(); // uzyskanie ID zalogowanego użytkownika
        ...//usuwanie wiadomości
    }

Chciałbym zapytać się Was, czy jest to jakaś duża różnica j jak wpływa to na bezpieczeństwo.

0

Tak, moim zdaniem jest to bezpieczne i lepsze. Kwestie bezpieczeństwa ogarnia ci spring, to czy jednej klasy użyjesz tu czy tam nie ma żadnego znaczenia.

Generalnie różnica jest taka, że kontoler powinien przyjąć wiadomość/żądanie od użytkownika i przekazać je dalej i nic poza tym. To serwisy (warstwa domeny, biznesu) są odpowiedzialne za posiadanie wiedzy o tym, że część akcji mogą wykonać tylko określeni użytkownicy i trzeba z jakiegoś miejsca pobrać o nich dane. Tu chodzi bardziej o ideę - bo przekazując ID z kontrolera nakładasz dodatkową odpowiedzialnosc na kontroler, a sam serwis dostaje tylko magicznego longa i musi dalej sobie z nim radzic. IMHO lepiej jest, gdy serwis ma jawna zaleznosc do drugiego serwisu odpowiedzialnego za autoryzacje i wtedy jest bardziej jasnym co jest czym

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