package Ġcom . real world . spring mongo . security Ċ Ċ import Ġcom . real world . spring mongo . exceptions . Invalid RequestException Ċ import Ġorg . springframework . context . annotation . Bean Ċ import Ġorg . springframework . context . annotation . Configuration Ċ import Ġorg . springframework . http . HttpHeaders Ċ import Ġorg . springframework . security . authentication . Reactive Authentication Manager Ċ import Ġorg . springframework . security . authentication . Username Password Authentication Token Ċ import Ġorg . springframework . security . core . authority . Simple Granted Authority Ċ import Ġorg . springframework . security . web . server . authentication . Authentication Web Filter Ċ import Ġorg . springframework . security . web . server . authentication . Server Authentication Converter Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġorg . springframework . web . server . Server Web Exchange Ċ import Ġreactor . kotlin . core . publisher . to Mono Ċ Ċ @ Configuration Ċ class ĠJwt Config Ġ{ ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġfun Ġjwt Server Authentication Converter ( token Formatter : ĠToken Formatter ): ĠServer Authentication Converter Ġ= ĊĠĠĠĠĠĠĠ ĠServer Authentication Converter Ġ{ Ġexchange Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauthorization Header Ġ= Ġget Authorization Header ( exchange ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthorization Header ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġtoken Formatter . getRow Token ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUsername Password Authentication Token ( token , Ġtoken ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Mono () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Authorization Header ( exchange : ĠServer Web Exchange ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheaders Ġ= Ġexchange . request . headers [ HttpHeaders . AUTHORIZATION ] Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠ Ġreturn Ġheaders . first OrNull ( String :: isNotEmpty ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġfun Ġjwt Auth Manager ( signer : ĠJwt Signer ): ĠReactive Authentication Manager Ġ= ĊĠĠĠĠĠĠĠ ĠReactive Authentication Manager Ġ{ Ġauthentication Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġauthentication . credentials Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġj ws Ġ= Ġsigner . validate ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauthority Ġ= ĠSimple Granted Authority (" ROLE _ USER ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġj ws . body . subject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Principal Ġ= ĠToken Principal ( userId , Ġtoken ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUsername Password Authentication Token ( token Principal , Ġtoken , ĠlistOf ( authority )). to Mono () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġfun Ġauthentication Filter ( ĊĠĠĠĠĠĠĠ Ġmanager : ĠReactive Authentication Manager , ĊĠĠĠĠĠĠĠ Ġconverter : ĠServer Authentication Converter ĊĠĠĠ Ġ): ĠAuthentication Web Filter Ġ= ĠAuthentication Web Filter ( manager ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġset Server Authentication Converter ( converter ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Component Ċ class ĠToken Formatter Ġ{ ĊĠĠĠ Ġfun Ġget Row Token ( authorization Header : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! authorization Header . startsWith (" Token Ġ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid RequestException (" Authorization ĠHeader ", Ġ" has Ġno Ġ` Token ` Ġprefix ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtoken Starts Ġ= Ġ" Token Ġ". length ĊĠĠĠĠĠĠĠ Ġreturn Ġauthorization Header . substring ( token Starts ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠToken Principal ( val ĠuserId : ĠString , Ġval Ġtoken : ĠString ) Ċ