摘要:用戶攜帶請求資源服務器資源服務器攔截器攜帶去認證服務器調用對合法性校驗資源服務器拿到,默認只會含有用戶名信息通過用戶名調用查詢用戶全部信息詳細性能瓶頸分析,請參考上篇文章擴展解決性能瓶頸本文是針對傳統使用的情況進行擴展,提高系統的吞吐率,解
用戶攜帶token 請求資源服務器
資源服務器攔截器 攜帶token 去認證服務器 調用tokenstore 對token 合法性校驗
資源服務器拿到token,默認只會含有用戶名信息
通過用戶名調用userdetailsservice.loadbyusername 查詢用戶全部信息
詳細性能瓶頸分析,請參考上篇文章《擴展jwt解決oauth2 性能瓶頸》
本文是針對傳統使用UUID token 的情況進行擴展,提高系統的吞吐率,解決性能瓶頸的問題
RemoteTokenServices 入口
@Override public OAuth2Authentication loadAuthentication(String accessToken) throws AuthenticationException, InvalidTokenException { MultiValueMapformData = new LinkedMultiValueMap (); formData.add(tokenName, accessToken); HttpHeaders headers = new HttpHeaders(); headers.set("Authorization", getAuthorizationHeader(clientId, clientSecret)); // 調用認證服務器的check-token 接口檢查token Map map = postForMap(checkTokenEndpointUrl, formData, headers); return tokenConverter.extractAuthentication(map); }
解析認證服務器返回的信息
DefaultAccessTokenConverter
public OAuth2Authentication extractAuthentication(Mapmap) { Map parameters = new HashMap (); Set scope = extractScope(map); // 主要是 用戶的信息的抽取 Authentication user = userTokenConverter.extractAuthentication(map); // 一些oauth2 信息的填充 OAuth2Request request = new OAuth2Request(parameters, clientId, authorities, true, scope, resourceIds, null, null, null); return new OAuth2Authentication(request, user); }
組裝當前用戶信息
DefaultUserAuthenticationConverter
public Authentication extractAuthentication(Map問題分析map) { if (map.containsKey(USERNAME)) { Object principal = map.get(USERNAME); Collection extends GrantedAuthority> authorities = getAuthorities(map); if (userDetailsService != null) { UserDetails user = userDetailsService.loadUserByUsername((String) map.get(USERNAME)); authorities = user.getAuthorities(); principal = user; } return new UsernamePasswordAuthenticationToken(principal, "N/A", authorities); } return null; }
認證服務器check-token 返回的全部信息
資源服務器在根據返回信息組裝用戶信息的時候,只是用了username
如果設置了 userDetailsService 的實現則去調用 loadUserByUsername 再去查詢一次用戶信息
造成問題現象如果設置了userDetailsService 即可在spring security 上下文獲取用戶的全部信息,不設置則只能得到用戶名。
增加了一次查詢邏輯,對性能產生不必要的影響
解決問題擴展UserAuthenticationConverter 的解析過程,把認證服務器返回的信息全部組裝到spring security的上下文對象中
/** * @author lengleng * @date 2019-03-07 ** 根據checktoken 的結果轉化用戶信息 */ public class PigxUserAuthenticationConverter implements UserAuthenticationConverter { private static final String N_A = "N/A"; // map 是check-token 返回的全部信息 @Override public Authentication extractAuthentication(Map
map) { if (map.containsKey(USERNAME)) { Collection extends GrantedAuthority> authorities = getAuthorities(map); String username = (String) map.get(USERNAME); Integer id = (Integer) map.get(SecurityConstants.DETAILS_USER_ID); Integer deptId = (Integer) map.get(SecurityConstants.DETAILS_DEPT_ID); Integer tenantId = (Integer) map.get(SecurityConstants.DETAILS_TENANT_ID); PigxUser user = new PigxUser(id, deptId, tenantId, username, N_A, true , true, true, true, authorities); return new UsernamePasswordAuthenticationToken(user, N_A, authorities); } return null; } }
給remoteTokenServices 注入這個實現
public class PigxResourceServerConfigurerAdapter extends ResourceServerConfigurerAdapter { @Override public void configure(ResourceServerSecurityConfigurer resources) { DefaultAccessTokenConverter accessTokenConverter = new DefaultAccessTokenConverter(); UserAuthenticationConverter userTokenConverter = new PigxUserAuthenticationConverter(); accessTokenConverter.setUserTokenConverter(userTokenConverter); remoteTokenServices.setRestTemplate(lbRestTemplate); remoteTokenServices.setAccessTokenConverter(accessTokenConverter); resources. .tokenServices(remoteTokenServices); } }
完成擴展,再來看文章開頭的流程圖就變成了如下
關注我個人項目 基于Spring Cloud、OAuth2.0開發基于Vue前后分離的開發平臺
QQ: 2270033969 一起來聊聊你們是咋用 spring cloud 的吧。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73794.html
摘要:用戶攜帶請求資源服務器資源服務器攔截器攜帶去認證服務器調用對合法性校驗資源服務器拿到,默認只會含有用戶名信息通過用戶名調用查詢用戶全部信息詳細性能瓶頸分析,請參考上篇文章擴展解決性能瓶頸本文是針對傳統使用的情況進行擴展,提高系統的吞吐率,解 showImg(https://segmentfault.com/img/remote/1460000018549849?w=519&h=402)...
如何對資源(前端頁面+后端接口)進行權限控制 在微服務架構中,請求的攔截在gateway中完成,而權限的查詢是在uaa中完成,在gateway和uaa集成部署的情況下實現較為簡單,如果兩者分離實現起來就會比較麻煩,一種方案是在gateway的資源filter中內部調用uaa的權限查詢模塊,該方案是可行的,但是存在兩個弊端: 響應延時:每個資源的請求都會附帶一次uaa內部調用,加重uaa服務的負擔...
摘要:授權框架使第三方應用程序來獲取對服務的有限訪問機會。無論是通過編排資源所有者和服務之間的交互批準的資源所有者,或通過允許第三方應用程序來獲取自己的訪問權限。 SpringCloud打造微服務平臺--概覽 簡述 SpringCloud是什么 Spring Boot和SpringCloud是什么關系 Spring Boot是Spring的一套快速WEB開發的腳手架,可建立獨立的Sprin...
閱讀 1176·2023-04-26 00:34
閱讀 3348·2023-04-25 16:47
閱讀 2110·2021-11-24 11:14
閱讀 3093·2021-09-26 09:55
閱讀 3685·2019-08-30 15:56
閱讀 3211·2019-08-29 16:57
閱讀 1903·2019-08-26 13:38
閱讀 2663·2019-08-26 12:22