Por lo general, mientras se trabaja con Spring Boot, una forma común de obtener usuarios registrados actualmente es usar:
SecurityContextHolder.getContext();Esto no funciona cuando se trabaja con programación reactiva y Mono en Java ya que no pertenecen al mismo hilo. Se recomienda utilizar:
ReactiveSecurityContextHolder.getContext()He leído muchos artículos, preguntas y respuestas de StackOverflow, pero nunca encontré una explicación completa o un ejemplo de cómo integrar completamente ReactiveSecurityContextHolder.
Cualquier ayuda sería muy apreciada.
Esto es lo que he probado:
@RequestMapping(value = "/get-auth", method = RequestMethod.GET) public @ResponseBody Mono<Authentication> test(Authentication authp) { return ReactiveSecurityContextHolder.getContext().map(SecurityContext::getAuthentication).doOnNext(auth -> { log.info("print auth", String.valueOf(auth)); }).doOnSuccess(auth -> { log.error("print auth", auth); }); } doOnSuccess - devuelve nulo
doOnNext - no activado
Suponiendo que la seguridad esté configurada correctamente. Spring security inicializa ReactiveSecurityContextHolder durante la suscripción para que pueda acceder a él dentro de esta cadena usando ReactiveSecurityContextHolder.getContext() :
@GetMapping Mono<Void> getItems() { return ReactiveSecurityContextHolder.getContext() .map(SecurityContext::getAuthentication) .doOnNext(auth -> log.info(String.valueOf(auth))) .then(); }Salida de muestra:
UsernamePasswordAuthenticationToken [Principal=org.springframework.security.core.userdetails.User [Username=admin, Password=[PROTECTED], Enabled=true, AccountNonExpired=true, credentialsNonExpired=true, AccountNonLocked=true, Autorizaciones otorgadas=[ROLE_ADMIN]], Credenciales=[PROTEGIDO], Autenticado=verdadero, Detalles=nulo, Autoridades otorgadas=[ROLE_ADMIN]]