《扩展北京快三源码开发服务器解决oauth2性能瓶颈》由会员分享,可在线阅读,更多相关《扩展北京快三源码开发服务器解决oauth2性能瓶颈(3页珍藏版)》请在金锄头文库上搜索。
1、 用户携带北京快三源码开发,需要详情咨询企娥166848365,token 请求资源服务器 资源服务器拦截器 携带token 去认证服务器 调用tokenstore 对token 合法性校验 资源服务器拿到token,默认只会含有用户名信息 通过用户名调用userdetailsservice.loadbyusername 查询用户全部信息详细性能瓶颈分析,请参考上篇文章扩展jwt解决oauth2 性能瓶颈本文是针对传统使用UUID token 的情况进行扩展,提高系统的吞吐率,解决性能瓶颈的问题默认check-token 解析逻辑 RemoteTokenServices 入口Overridep
2、ublic OAuth2Authentication loadAuthentication(String accessToken) throws AuthenticationException, InvalidTokenException MultiValueMap formData = new LinkedMultiValueMap();formData.add(tokenName, accessToken);HttpHeaders headers = new HttpHeaders();headers.set(Authorization, getAuthorizationHeader(cl
3、ientId, clientSecret);/ 调用认证服务器的check-token 接口检查tokenMap map = postForMap(checkTokenEndpointUrl, formData, headers); return tokenConverter.extractAuthentication(map); 解析认证服务器返回的信息DefaultAccessTokenConverterpublic OAuth2Authentication extractAuthentication(Map map) Map parameters = new HashMap();Set
4、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); 组装当前用户信
5、息DefaultUserAuthenticationConverterpublic Authentication extractAuthentication(Map map) if (map.containsKey(USERNAME) Object principal = map.get(USERNAME);Collection authorities = getAuthorities(map);if (userDetailsService != null) UserDetails user = userDetailsService.loadUserByUsername(String) map
6、.get(USERNAME);authorities = user.getAuthorities();principal = user;return new UsernamePasswordAuthenticationToken(principal, N/A, authorities);return null;问题分析 认证服务器check-token 返回的全部信息 资源服务器在根据返回信息组装用户信息的时候,只是用了username 如果设置了 userDetailsService 的实现则去调用 loadUserByUsername 再去查询一次用户信息造成问题现象1. 如果设置了use
7、rDetailsService 即可在spring security 上下文获取用户的全部信息,不设置则只能得到用户名。2. 增加了一次查询逻辑,对性能产生不必要的影响解决问题 扩展UserAuthenticationConverter 的解析过程,把认证服务器返回的信息全部组装到spring security的上下文对象中/* * author lengleng * date 2019-03-07 * * 根据checktoken 的结果转化用户信息 */public class PigxUserAuthenticationConverter implements UserAuthentic
8、ationConverter private static final String N_A = N/A; / map 是check-token 返回的全部信息Overridepublic Authentication extractAuthentication(Map map) if (map.containsKey(USERNAME) Collection authorities = getAuthorities(map);String username = (String) map.get(USERNAME);Integer id = (Integer) map.get(Security
9、Constants.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 UsernamePasswor
10、dAuthenticationToken(user, N_A, authorities);return null; 给remoteTokenServices 注入这个实现public class PigxResourceServerConfigurerAdapter extends ResourceServerConfigurerAdapter Overridepublic void configure(ResourceServerSecurityConfigurer resources) DefaultAccessTokenConverter accessTokenConverter = n
11、ew DefaultAccessTokenConverter();UserAuthenticationConverter userTokenConverter = new PigxUserAuthenticationConverter();accessTokenConverter.setUserTokenConverter(userTokenConverter);remoteTokenServices.setRestTemplate(lbRestTemplate);remoteTokenServices.setAccessTokenConverter(accessTokenConverter);resources.tokenServices(remoteTokenServices);