在調用資源服務器的過程中,我們會將申請的token 作為header值進行傳遞,攜帶調用者的身份信息。但是資源服務器是如何通過token對調用者的身份進行判斷的呢?
Security中有壹個Filter實現了對token信息的轉換,將token值轉換成了調用者的用戶信息。該filter就是 Oauth2AuthenticationProcessingFilter
壹、查看源碼
查看Oauth2AuthenticationProcessingFilter的doFilter方法
通過查看Oauth2AuthenticationProcessingFilter的dofilter方法,重點有兩點
(1)將request中的token提取出來封裝成Authentication對象
(2)將Authentication交給authenticationManager進行鑒權處理
下面我們重點看下這兩處的處理。
二、token到Authentication對象轉換實現
Authentication authentication = tokenExtractor .extract(request);
tokenExtractor在Oauth2AuthencationProcessingFilter中的默認實現是BearerTokenExtractor,我們查看BearerTokenExtractor的extract()方法。
三、Authentication對象的鑒權
Authentication authResult = authenticationManager .authenticate(authentication);
此處的authenticationManager的實現類是Oauth2AuthenticationManager,而不是我們之前壹直提到的ProvicerManager。我們看下Oauth2AuthenticationManager中的authenticate()方法。
RemoteTokenService 的 loadAuthentication() 方法
用戶認證轉換類
* 接口層註入的 OAuth2Authentication對象中的 principal屬性即在該類的extractAuthentication() 方法中實現的。
* security默認使用的是 DefaultAccessTokenConverter類中的extractAuthentication()方法中使用。
* 通過繼承UserAuthenticationConverter該類,實現其中的extractAuthentication()方法來滿足我們自己構造 principal屬性的需求。
* 在ResourceConfig類中,繼續使用DefaultAccessTokenConverter,但是類中的UserAuthenticationConverter我們裏換成我們自己的CustomUserAuthenticationConverter實現類。
*
* 我們構造的principal屬性是map類,裏面包含phone和userId兩個字段。