春天反应安全| 如何实现反应式 PermissionEvaluator

Mar*_*lze 5 spring-security spring-webflux

假设我们有一个带注释的休息控制器方法:

@PreAuthorize("hasPermission(#username, 'USER_PROFILE', 'WRITE')")
Run Code Online (Sandbox Code Playgroud)

在 Spring MVC 中,我们将实现一个PermissionEvaluator来实现隐藏在以下方法签名后面的授权

boolean hasPermission(
  Authentication authentication, 
  Serializable targetId, 
  String targetType,
  Object permission
)
Run Code Online (Sandbox Code Playgroud)

只要您不需要在 hasPermission 方法中调用反应式服务/方法,这在使用 Spring WebFlux 时似乎仍然有效,我想这种情况很少发生,因为您通常希望为数据库层使用反应式接口以及。如果您无论如何都要在此方法中调用反应式服务,您将需要在某个时间调用block()一些服务Mono,从而遇到麻烦,因为您是从反应式管道中调用的。

Josh Long关于 Spring WebFlux 安全性的教程中,他解释了如何SecurityWebFilterchain通过提供自定义ReactiveAuthorizationManagers直接在使用路径匹配器上实现授权。但是PreAuthorize在 Spring WebFlux 中没有解释如何使用注解。

我期待实施一些 ReactivePermissionEvaluator

Mono<Boolean> hasPermission(
  Authentication authentication, 
  Serializable targetId, 
  String targetType,
  Object permission
)
Run Code Online (Sandbox Code Playgroud)

这也将允许在实现中使用反应式服务,但我无法找到ReactiveAuthorizationManager可以扫描PreAuthorize注释并将评估分派给反应式的PermissionEvaluator任何实现,ReactivePermissionEvaluator接口也不存在。

所以最后的问题是,如何实现一个PermissionEvaluator允许调用反应式服务的反应式,例如在不阻塞的情况下查询数据库以获取授权信息?

cam*_*err 2

遗憾的是... Spring Security 尚未支持此功能https://github.com/spring-projects/spring-security/issues/5046