/* Ċ Ġ* ĠCopyright Ġ 2 0 0 2 - 2 0 2 0 Ġthe Ġoriginal Ġauthor Ġor Ġauthors . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . springframework . fu . k of u . web mvc Ċ Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . springframework . beans . factory . getBean Ċ import Ġorg . springframework . context . ApplicationContext Ċ import Ġorg . springframework . fu . k of u .* Ċ import Ġorg . springframework . security . authentication . Provider Manager Ċ import Ġorg . springframework . security . authentication . dao . Dao Authentication Provider Ċ import Ġorg . springframework . security . config . annotation . web . builders . Http Security Ċ import Ġorg . springframework . security . core . user details . User Ċ import Ġorg . springframework . security . provisioning . InMemory UserDetails Manager Ċ import Ġorg . springframework . security . web . csrf . Cs rf Token Ċ import Ġorg . springframework . security . web . csrf . Cs rf Token Repository Ċ import Ġorg . springframework . security . web . csrf . Default Cs rf Token Ċ import Ġorg . springframework . test . web . reactive . server . Web Test Client Ċ import Ġjava . time . Duration Ċ import Ġjavax . servlet . http . HttpServletRequest Ċ import Ġjavax . servlet . http . HttpServletResponse ĊĊ Ċ /** Ċ Ġ* Ġ@ author ĠF red ĠMont ari ol Ċ Ġ*/ Ċ class ĠSecurity Dsl Tests Ġ{ ĊĊ ĉ @ Test Ċ ĉ fun Ġ` Check Ġspring - security Ġconfiguration ĠDSL Ġwith Ġprovided Ġuser Details Service `() Ġ{ Ċĉ ĉ val Ġapp Ġ= Ġweb Application Ġ{ Ċĉĉ ĉ web Mvc Ġ{ Ċĉĉĉ ĉ port Ġ= Ġ 0 ĊĊĉĉĉ ĉ router Ġ{ Ċĉĉĉĉ ĉ GET ("/ public - view ") Ġ{ Ġok (). build () Ġ} Ċĉĉĉĉ ĉ GET ("/ view ") Ġ{ Ġok (). build () Ġ} Ċĉĉĉĉ ĉ POST ("/ public - post ") Ġ{ Ġok (). build () Ġ} Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ security Ġ{ Ċĉĉĉĉ ĉ user Details Service Ġ= Ġuser Details Service () ĊĊĉĉĉĉ ĉ http Ġ{ Ċĉĉĉĉĉ ĉ authorize Requests Ġ{ Ċĉĉĉĉĉĉ ĉ authorize ("/ public - view ", Ġpermit All ) Ċĉĉĉĉĉĉ ĉ authorize ("/ view ", Ġhas Role (" USER ")) Ċĉĉĉĉĉĉ ĉ authorize ("/ public - post ", Ġpermit All ) Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ http Basic Ġ{} Ċĉĉĉĉĉ ĉ csrf Ġ{ Ċĉĉĉĉĉĉ ĉ csrf Token Repository Ġ= Ġcsrf Token Repository () Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ app . run (). apply Ġ{ Ċĉĉ ĉ // Ġverify Ġthat Ġbe ans Ġare Ġpresent Ġin Ġcontext Ċĉĉ ĉ getBean < Http Security >() ĊĊĉĉ ĉ test Security Web Mvc ( this ) ĊĊĉĉ ĉ close () Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ @ Test Ċ ĉ fun Ġ` Check Ġspring - security Ġconfiguration ĠDSL Ġwith Ġprovided Ġauthentication Manager `() Ġ{ Ċĉ ĉ val Ġauth Provider Ġ= ĠDao Authentication Provider () Ċĉ ĉ auth Provider . setUser Details Service ( user Details Service ()) Ċĉ ĉ val Ġrepo Authentication Manager Ġ= ĠProvider Manager ( auth Provider ) ĊĊĉ ĉ val Ġapp Ġ= Ġweb Application Ġ{ Ċĉĉ ĉ web Mvc Ġ{ Ċĉĉĉ ĉ port Ġ= Ġ 0 ĊĊĉĉĉ ĉ router Ġ{ Ċĉĉĉĉ ĉ GET ("/ public - view ") Ġ{ Ġok (). build () Ġ} Ċĉĉĉĉ ĉ GET ("/ view ") Ġ{ Ġok (). build () Ġ} Ċĉĉĉĉ ĉ POST ("/ public - post ") Ġ{ Ġok (). build () Ġ} Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ security Ġ{ Ċĉĉĉĉ ĉ authentication Manager Ġ= Ġrepo Authentication Manager ĊĊĉĉĉĉ ĉ http Ġ{ Ċĉĉĉĉĉ ĉ authorize Requests Ġ{ Ċĉĉĉĉĉĉ ĉ authorize ("/ public - view ", Ġpermit All ) Ċĉĉĉĉĉĉ ĉ authorize ("/ view ", Ġhas Role (" USER ")) Ċĉĉĉĉĉĉ ĉ authorize ("/ public - post ", Ġpermit All ) Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ http Basic Ġ{} Ċĉĉĉĉĉ ĉ csrf Ġ{ Ċĉĉĉĉĉĉ ĉ csrf Token Repository Ġ= Ġcsrf Token Repository () Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ app . run (). apply Ġ{ Ċĉĉ ĉ // Ġverify Ġthat Ġbe ans Ġare Ġpresent Ġin Ġcontext Ċĉĉ ĉ getBean < Http Security >() ĊĊĉĉ ĉ test Security Web Mvc ( this ) ĊĊĉĉ ĉ close () Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ private Ġfun Ġuser Details Service () Ġ= Ċĉĉ ĉ InMemory UserDetails Manager ( Ċĉĉĉĉ ĉ @ Suppress (" DE PREC ATION ") Ċĉĉĉĉ ĉ User . with Default Password Encoder () Ċĉĉĉĉĉĉ ĉ . username ( username Test ) Ċĉĉĉĉĉĉ ĉ . password ( password Test ) Ċĉĉĉĉĉĉ ĉ . roles (" USER ") Ċĉĉĉĉĉĉ ĉ . build () Ċĉĉ ĉ ) ĊĊ ĉ private Ġfun Ġcsrf Token Repository () Ġ= Ġobject Ġ: ĠC s rf Token Repository Ġ{ ĊĊĉ ĉ override Ġfun Ġgenerate Token ( request : ĠHttpServletRequest ) Ġ= Ċĉĉĉ ĉ Default Cs rf Token ( csrf Header Test , Ġ" not _ used ", Ġcsrf Token Test ) ĊĊĉ ĉ override Ġfun Ġsave Token ( token : ĠC s rf Token ?, Ġrequest : ĠHttpServletRequest , Ġresponse : ĠHttpServletResponse ) Ġ{ Ċĉĉ ĉ if Ġ( token Ġ== Ġnull ) Ġ{ Ċĉĉĉ ĉ request . getSession ( false ). removeAttribute ( csrf Session Attribute ) Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ request . session . setAttribute ( csrf Session Attribute , Ġtoken ) Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ override Ġfun Ġload Token ( request : ĠHttpServletRequest ): ĠC s rf Token ? Ġ{ Ċĉĉ ĉ val Ġsession Ġ= Ġrequest . getSession ( false ) Ġ?: Ġreturn Ġnull Ċĉĉ ĉ return Ġ( session . getAttribute ( csrf Session Attribute ) Ġas ĠC s rf Token ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ private Ġfun Ġtest Security Web Mvc ( context : ĠApplication Context ) Ġ{ Ċĉ ĉ val Ġclient Ġ= ĠWeb Test Client . bind ToServer () Ċĉĉĉ ĉ . baseUrl (" http :// 1 2 7 . 0 . 0 . 1 :${ context . local Server Port }") Ċĉĉĉ ĉ . response Timeout ( Duration . of Minutes ( 1 0 )) Ġ// Ġuseful Ġfor Ġdebug Ċĉĉĉ ĉ . build () ĊĊĉ ĉ common Tests ( client ) ĊĊĉ ĉ // ĠVerify Ġpost Ġsucceed Ġwith Ġcsrf Ġheader Ċĉ ĉ client Ċĉĉĉ ĉ . post (). uri ("/ public - post ") Ċĉĉĉ ĉ . header ( csrf Header Test , Ġcsrf Token Test ) Ċĉĉĉ ĉ . exchange () Ċĉĉĉ ĉ . expect Status (). is 2 xx Successful Ċ ĉ } Ċ } Ċ