Предполагая, что мы получили аннотированный метод контроллера остатка с:
@PreAuthorize("hasPermission(#username, 'USER_PROFILE', 'WRITE')")
В Spring MVC мы реализовали бы PermissionEvaluator
для реализации авторизации, скрытой за следующей сигнатурой метода
boolean hasPermission(
Authentication authentication,
Serializable targetId,
String targetType,
Object permission
)
Это по-прежнему работает при использовании Spring WebFlux до тех пор, пока вам не нужно вызывать реактивный сервис / метод внутри метода hasPermission, что, как я полагаю, редко встречается, так как вы обычно хотели бы использовать реактивный интерфейс для вашей базы данныхслой также.Если бы вы в любом случае вызвали бы реактивную службу внутри этого метода, вам нужно было бы в какой-то момент вызвать block()
для некоторого Mono
и, таким образом, столкнуться с проблемой, поскольку вы вызывались из реактивного конвейера.
ВВ руководстве Джоша Лонга о безопасности с помощью Spring WebFlux он объясняет, как реализовать авторизацию непосредственно на SecurityWebFilterchain
с использованием сопоставителей путей, предоставляя пользовательские ReactiveAuthorizationManager
s.Но нет объяснения, как использовать аннотацию PreAuthorize
в Spring WebFlux.
Я ожидал реализовать некоторые ReactivePermissionEvaluator
Mono<Boolean> hasPermission(
Authentication authentication,
Serializable targetId,
String targetType,
Object permission
)
, которые также позволят использовать реактивные сервисы в реализации, но я не смог найти какую-либо реализацию ReactiveAuthorizationManager
который сканировал бы аннотацию PreAuthorize
и отправлял бы оценку реактиву PermissionEvaluator
, а интерфейс ReactivePermissionEvaluator
не существовал.
Итак, наконец, как реализовать реактив PermissionEvaluator
* что позволяет вызывать реактивную службу, например, запрашивать в базе данных информацию об авторизации без блокировки?