• 用户携带token 请求资源服务器
  • 资源服务器拦截器 携带token 去认证服务器 调用tokenstore 对token 合法性校验
  • 资源服务器拿到token,默认只会含有用户名信息
  • 通过用户名调用userdetailsservice.loadbyusername 查询用户全部信息

详细性能瓶颈分析,请参考上篇文章《扩展jwt解决oauth2 性能瓶颈》
本文是针对传统使用UUID token 的情况进行扩展,提高系统的吞吐率,解决性能瓶颈的问题

默认check-token 解析逻辑

  • RemoteTokenServices 入口
@Override
public OAuth2Authentication loadAuthentication(String accessToken) throws AuthenticationException, InvalidTokenException {MultiValueMap<String, String> formData = new LinkedMultiValueMap<String, String>();formData.add(tokenName, accessToken);HttpHeaders headers = new HttpHeaders();headers.set("Authorization", getAuthorizationHeader(clientId, clientSecret));// 调用认证服务器的check-token 接口检查tokenMap<String, Object> map = postForMap(checkTokenEndpointUrl, formData, headers);return tokenConverter.extractAuthentication(map);
}
  • 解析认证服务器返回的信息
    DefaultAccessTokenConverter
public OAuth2Authentication extractAuthentication(Map<String, ?> map) {Map<String, String> parameters = new HashMap<String, String>();Set<String> 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<String, ?> 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 再去查询一次用户信息

造成问题现象

  1. 如果设置了userDetailsService 即可在spring security 上下文获取用户的全部信息,不设置则只能得到用户名。
  2. 增加了一次查询逻辑,对性能产生不必要的影响

解决问题

  • 扩展UserAuthenticationConverter 的解析过程,把认证服务器返回的信息全部组装到spring security的上下文对象中
/*** @author lengleng* @date 2019-03-07* <p>* 根据checktoken 的结果转化用户信息*/
public class PigxUserAuthenticationConverter implements UserAuthenticationConverter {private static final String N_A = "N/A";// map 是check-token 返回的全部信息@Overridepublic Authentication extractAuthentication(Map<String, ?> 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 {@Overridepublic 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 的吧。

扩展资源服务器解决oauth2 性能瓶颈相关推荐

  1. SpringSecurity(二十)---OAuth2:实现资源服务器(上)资源服务器搭建以及直接调用授权服务器模式

    一. 前言 本章将讨论如何使用Spring Security实现一个资源服务器,资源服务器是管理用户资源的组件.另外,学习本章有个前提,需要先把前面搭建授权服务器的相关文章先给阅读,否则可能后面出现的 ...

  2. 织梦mysql占用资源_解决一个 MySQL 服务器进程 CPU 占用 100%的技术笔记

    早上帮朋友一台服务器解决了Mysql cpu 占用 100%的问题.稍整理了一下: 朋友主机(Windows 2003 + IIS + PHP + MYSQL )近来 MySQL 服务进程 (mysq ...

  3. 使用Spring Security Oauth2 和 JWT保护微服务--资源服务器的编写

    编写hcnet-website的资源服务 依赖管理pom文件 hcnet-website工程的pom文件继承主maven的pom文件.在hcnet-website工程的pom文件中添加web功能的起步 ...

  4. springsecurity03-springsecurity oauth2实现单点登录之-资源服务器(Resource Service)

    文章目录 资源文件简介 资源文件实战 授权服务器改造 资源服务器改造 资源文件简介 文章参考自 https://projects.spring.io/spring-security-oauth/doc ...

  5. Spring Security Oauth2 在资源服务器如何获取jwt中的额外信息

    在上一篇Spring Security Oauth2 中实现TokenEnhancer向jwt中添加额外信息中,笔者向大家介绍了如何向jwt中存额外信息(extraInfo) 接下来这篇blog,笔者 ...

  6. 《预训练周刊》第23期:Smart Bird:解决变换器性能瓶颈的新方法、Prompt:如何提升预训练模型的迁移效果...

    No.23 智源社区 预训练组 预 训 练 研究 观点 资源 活动 关于周刊 超大规模预训练模型是当前人工智能领域研究的热点,为了帮助研究与工程人员了解这一领域的进展和资讯,智源社区整理了第23期&l ...

  7. php静态资源服务器,Node实现静态资源服务器

    这次给大家带来Node实现静态资源服务器,Node实现静态资源服务器的注意事项有哪些,下面就是实战案例,一起来看一下. http的原理是对请求和响应进行了包装,当客户端连接上来之后先触发connect ...

  8. NodeJS 创建静态资源服务器

    最近,学习了一下 NodeJS 自己研究了一个静态资源服务器写的不好,希望高手多多指教 目录结构 文件详解 .gitignore 文件 这个文件主要是我们将本地项目上传到 GitHub 上时,忽略的文 ...

  9. 《预训练周刊》第23期:Smart Bird:解决变换器性能瓶颈的新方法

    (本期贡献者:申德周 翟珂 吴新刚) 本文来源:智源社区 论文推荐 标题:斯坦福.马里兰大学|Quantum Cross Entropy and Maximum Likelihood Principl ...

最新文章

  1. python【蓝桥杯vip练习题库】ALGO-86矩阵乘法(枚举)
  2. 在Visual Studio 2019(VS2019)中使用GIT进行代码控制
  3. OpenGL相机控制之一
  4. 申请邓白氏编码和公司开发者账号需要的东西
  5. SQL表名,应该用复数还是单数
  6. php unserialize 返回false的解决方法
  7. 常见的6种MySQL约束
  8. jQuery使用总结 - jQuery组成和主要功能 1/4
  9. Java虚拟机 --- 内存区域
  10. JavaScript 验证 API中的setCustomValidity()方法
  11. 第一次做APP接口开发过程总结
  12. 网站的LOGO尺寸大小参考
  13. java 几何平均数_统计学——平均数
  14. npm error! npm Maxium size exceed
  15. 3D 专业词汇 (转)
  16. Jackie Chan Comments Spark Online Backlash
  17. mac抹掉磁盘重装系统未能与服务器取得联系_如何用U盘自制Mac笔记本系统重装盘...
  18. css表格随内容变化,css 使表格随着内容自动适应宽度
  19. BZOJ 3876 AHOI2014 支线剧情 费用流
  20. Linux 0.11-重新设置idt和gdt-08

热门文章

  1. 高斯旋转热源与双椭球热源_电力分公司:多措并举保证供暖质量效益双提升
  2. 研究者设计了Fastball任务早期诊断阿尔茨海默病
  3. AttributeError:module“seaborn” has no attribute “lineplot”
  4. 常见采集脑电信号的四种技术
  5. 高速无人机独立穿越森林,全程自己规划路线,时速高达40公里
  6. 仿真环境跟车2分钟,就让自动驾驶系统撞上马路牙子,攻破率超90%,多传感器融合系统都失效...
  7. GitHub万星NLP资源大升级:实现Pytorch和TF深度互操作,集成32个最新预训练模型...
  8. 起底华为计算战略:十五年研发下苦功,三年连发10芯加速,目前2万工程师奋战...
  9. js获取URL请求参数与改变src
  10. 运维日常:群发邮件营销平台--EDM