Spring Reactive Security |Как реализовать реактивный PermissionEvaluator - PullRequest
0 голосов
/ 20 мая 2018

Предполагая, что мы получили аннотированный метод контроллера остатка с:

@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* что позволяет вызывать реактивную службу, например, запрашивать в базе данных информацию об авторизации без блокировки?

1 Ответ

0 голосов
/ 01 апреля 2019

К сожалению ... это еще не поддерживается Spring Security в https://github.com/spring-projects/spring-security/issues/5046

...