package Ġcom . menu xx . sso . auth Ċ Ċ import Ġorg . springframework . security . authentication . Username Password Authentication Token Ċ import Ġorg . springframework . security . core . context . SecurityContext Holder Ċ import Ġorg . springframework . security . core . user details . UserDetails Service Ċ import Ġorg . springframework . security . web . authentication . Username Password Authentication Filter Ċ import Ġjavax . servlet . FilterChain Ċ import Ġjavax . servlet . Servlet Request Ċ import Ġjavax . servlet . Servlet Response Ċ import Ġjavax . servlet . http . HttpServletRequest Ċ Ċ /** Ċ Ġ* Ġä½ľèĢħ : Ġy in ch ang sh eng @ gmail . com Ċ Ġ* ĠåĪĽå»º äºİ : Ġ 2 0 1 7 / 1 2 / 1 8 Ċ Ġ* Ġ å¾®ä¿¡ : Ġy in 8 0 8 7 1 9 0 1 Ċ Ġ*/ Ċ Ċ class ĠAuthentication Token Filter ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtoken Header : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġwx UserDetails Service : ĠUser Details Service , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmerchant User Detail Service : ĠUser Details Service , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġadmin UserDetails Service Ġ: ĠUser Details Service , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtoken Processor : ĠToken Processor Ċ ) Ġ: ĠUsername Password Authentication Filter () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġdo Filter ( request : ĠServlet Request , Ġresponse : ĠServlet Response , Ġchain : ĠFilter Chain ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreq Ġ= Ġrequest Ġas ĠHttpServletRequest ĊĠĠĠĠĠĠĠ Ġval Ġauth Token Ġ= Ġreq . getHeader ( token Header ) ĊĠĠĠĠĠĠĠ Ġif Ġ( Ġauth Token Ġ!= Ġnull Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ç§»éĻ¤ Ġ å¼Ģ å¤´ çļĦ Ġ` token Ġ` Ġ åŃĹç¬¦ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġauth Token . substring ( 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġä»İ çĶ¨æĪ· ä¼ł æĿ¥çļĦ Ġtoken Ġä¸Ń èİ·åıĸ Ġ åħ³éĶ® Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprincipal Ġ= Ġtoken Processor . get Principal From Token ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Type Ġ= Ġtoken Processor . getUser type From Token ( token ) Ġ?: Ġchain . do Filter ( request , Ġresponse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġæł¹æį® çĶ¨æĪ· ç±»åŀĭ Ġ ç¡®å®ļ Ġdetail Service ĠçĶ¨æĪ· ç±»åŀĭ åľ¨ Ġtoken Ġä¸Ń åŃĺåĤ¨ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdetail Service Ġ= Ġwhen ( user Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuth User Type Normal Ġ-> Ġwx UserDetails Service ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuth User Type Merchant Ġ-> Ġmerchant User Detail Service ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuth User Type Admin Ġ-> Ġadmin UserDetails Service ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn Ġchain . do Filter ( request , Ġresponse ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ è¯¥ çĶ¨æĪ· éľĢè¦ģ çĻ»å½ķ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Ġprincipal Ġ!= Ġnull Ġ&& ĠSecurity Context Holder . getContext (). authentication Ġ== Ġnull Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauth User Ġ= Ġdetail Service . load User By Username ( principal ) Ġas ĠAuth User ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ éªĮè¯ģ è¯¥ çĶ¨æĪ· çļĦ Ġtoken Ġæĺ¯åĲ¦ æŃ£ç¡® ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Ġtoken Processor . validate Token ( token , Ġauth User ) Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauthentication Ġ= ĠUsername Password Authentication Token ( auth User , Ġnull , Ġauth User . author ities ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSecurity Context Holder . getContext (). authentication Ġ= Ġauthentication ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġchain . do Filter ( request , Ġresponse ) ĊĠĠĠ Ġ} Ċ }