Używam bagażnik wiosna, a ja umożliwiły globalne bezpieczeństwo metody w WebSecurityConfigurerAdapter przezJak @PreAuthorize mające wyższy priorytet niż @Valid lub @Validated
@EnableGlobalMethodSecurity(prePostEnabled = true, order = Ordered.HIGHEST_PRECEDENCE)
I Poniżej jest mój kod kontrolera
@PreAuthorize("hasAnyRole('admin') or principal.id == id")
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
public User updateUser(@PathVariable("id") String id, @Valid @RequestBody UserDto userDto)
{ ....}
Jednak, gdy użytkownik niebędący administratorem próbuje wykonać żądanie PUT, walidator JSR303 zostanie uruchomiony przed @PreAuthorize. Na przykład użytkownik, który nie jest administratorem, otrzymywał coś w stylu "imię jest wymagane" zamiast "odmowa dostępu". Ale po podaniu przez użytkownika pierwszej zmiennej imienia, aby przekazać walidator, zwracano odmowę dostępu.
Czy ktoś wie, jak wymusić sprawdzenie @PreAuthorize przed sprawdzeniem @Valid lub @Validated?
I muszę użyć tego rodzaju autoryzacji na poziomie metody zamiast autoryzacji opartej na adresach URL, aby przeprowadzić pewne skomplikowane sprawdzanie reguł.
To się nigdy nie zdarzy. '@ PreAuthorize' jest wywoływany tylko podczas wykonywania metody. Jednak "@ Valid" jest przetwarzany podczas przygotowywania wykonania metody, co dzieje się przed faktycznym wykonaniem metody. To nie zadziała. Podczas pracy możesz wykonywać ręczne sprawdzanie poprawności, zamiast polegać na adnotacji "@ Valid". –
Rozumiem. Dziękuję za wyjaśnienie, jak to działa w tle. Myślę, że byłoby wspaniale, gdyby w przyszłości mogli wspierać walidację po PreAuthorize. – user2763165
To byłoby trudne, ponieważ mogłoby to zmienić cały sposób działania AOP :).Widzę poprawę w zakresie mapowania adresów URL i dodawania do nich zabezpieczeń. Obecnie używane są tylko wyrażenia w stylu mrówki i wyrażenia regularne, ale widzę, że można chcieć użyć zmiennych ścieżkowych również dla bezpieczeństwa. –