=== Demo 5: ReactiveSecurityContextHolder vs. ThreadLocal across a scheduler hop === A) SecurityContextHolder (ThreadLocal), no scheduler hop: authenticated as alice B) SecurityContextHolder (ThreadLocal), AFTER publishOn to a different thread: NO AUTHENTICATION (lost) [proves ThreadLocal doesn't survive a scheduler hop] C) ReactiveSecurityContextHolder + contextWrite, no scheduler hop: Hello, carol D) ReactiveSecurityContextHolder + contextWrite, AFTER publishOn to a different thread: Hello, dave [Context travels with the stream, not the thread] E) getProfile() with no contextWrite() upstream at all: Anonymous [defaultIfEmpty fires; getContext() completes empty, it does not error]