package Ġde . bus am . app Ċ Ċ import Ġio . jav al in . core . security . Role Ċ import Ġio . jav al in . http . Context Ċ import Ġio . jav al in . http . Handler Ċ Ċ enum Ġclass ĠApi Role Ġ: ĠRole Ġ{ ĠANY ONE , ĠUSER _ READ , ĠUSER _ WRITE Ġ} Ċ Ċ object ĠAuth Ġ{ ĊĠĠĠ Ġfun Ġaccess Manager ( handler : ĠHandler , Ġctx : ĠContext , Ġpermitted Roles : ĠSet < Role >) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermitted Roles . contains ( Api Role . ANY ONE ) Ġ-> Ġhandler . handle ( ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . user Roles . any Ġ{ Ġit Ġin Ġpermitted Roles Ġ} Ġ-> Ġhandler . handle ( ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . path (). contains (" routes ") Ġ-> Ġhandler . handle ( ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġctx . status ( 4 0 1 ). json (" Unauthorized ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġget Ġroles Ġfrom Ġuser Role Map Ġafter Ġextracting Ġusername / password Ġfrom Ġbasic - auth Ġheader ĊĠĠĠ Ġprivate Ġval ĠContext . user Roles : ĠList < Api Role > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis . basic Auth Credentials (). let Ġ{ Ġ( username , Ġpassword ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Role Map [ Pair ( username , Ġpassword )] Ġ?: ĠlistOf () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠFIXME : ĠDon 't Ġstore Ġpasswords Ġin Ġclear Ġtext Ġ( and Ġin Ġmemory ). ĊĠĠĠ Ġ// Ġuse Ġbcrypt Ġ( http :// www . mind rot . org / projects / j BC rypt /) Ġor Ġsomething Ġelse ĊĠĠĠ Ġprivate Ġval Ġuser Role Map Ġ= Ġhash Map Of ( ĊĠĠĠĠĠĠĠ ĠPair (" alice ", Ġ" 1 2 3 ") Ġto ĠlistOf ( Api Role . USER _ READ ), ĊĠĠĠĠĠĠĠ ĠPair (" bob ", Ġ" abc ") Ġto ĠlistOf ( Api Role . USER _ READ , ĠApi Role . USER _ WRITE ) ĊĠĠĠ Ġ) Ċ Ċ }