Spring Cloud OAuth 实现微服务内部Token传递的源码解析
原
荐
字数 739
阅读 11
收藏 0
八年 Java 开发的感悟:什么才是 程序员 的立身之本 >>>
背景分析
-
1.客户端携带认证中心发放的token,请求资源服务器A( Spring Security OAuth 发放Token 源码解析 )
-
2.客户端携带令牌直接访问资源服务器,资源服务器通过对token 的校验 ( Spring Cloud OAuth2 资源服务器CheckToken 源码解析 ) 判断用户的合法性,并保存到上下文中
-
3.A服务接口接收到请求,需要通过Feign或者其他RPC框架调用B服务来组装返回数据
本文主要来探讨第三部 A --> B ,token 自定维护的源码实现
如何实现token 传递
配置OAuth2FeignRequestInterceptor 即可
- 此类是Feign 的拦截器实现
@Bean @ConditionalOnProperty("security.oauth2.client.client-id") public RequestInterceptor oauth2FeignRequestInterceptor(OAuth2ClientContext oAuth2ClientContext, OAuth2ProtectedResourceDetails resource,) { return new OAuth2FeignRequestInterceptor(oAuth2ClientContext, resource); }
源码解析
- 获取上下文中的token ,组装到请求头
public class OAuth2FeignRequestInterceptor implements RequestInterceptor { // 给请求增加 token @Override public void apply(RequestTemplate template) { template.header(header, extract(tokenType)); } protected String extract(String tokenType) { OAuth2AccessToken accessToken = getToken(); return String.format("%s %s", tokenType, accessToken.getValue()); } // 从spring security 上下文中获取token public OAuth2AccessToken getToken() { OAuth2AccessToken accessToken = oAuth2ClientContext.getAccessToken(); if (accessToken == null || accessToken.isExpired()) { try { accessToken = acquireAccessToken(); } } return accessToken; } }
- 再来看AccessTokenContextRelay, 上下文token 中转器.非常简单从上下文获取认证信息得到把 token 放到上下文
public class AccessTokenContextRelay { private OAuth2ClientContext context; public AccessTokenContextRelay(OAuth2ClientContext context) { this.context = context; } public boolean copyToken() { if (context.getAccessToken() == null) { Authentication authentication = SecurityContextHolder.getContext() .getAuthentication(); if (authentication != null) { Object details = authentication.getDetails(); if (details instanceof OAuth2AuthenticationDetails) { OAuth2AuthenticationDetails holder = (OAuth2AuthenticationDetails) details; String token = holder.getTokenValue(); DefaultOAuth2AccessToken accessToken = new DefaultOAuth2AccessToken( token); String tokenType = holder.getTokenType(); if (tokenType != null) { accessToken.setTokenType(tokenType); } context.setAccessToken(accessToken); return true; } } } return false; } }
- 什么时候执行中转,oauth2 资源服务器非常简单暴力,加了个拦截器给转发。
源码非常简单
谈谈spring security oauth 实现的问题
- 当请求上线文没有Token,如果调用feign 会直接,这个OAuth2FeignRequestInterceptor 肯定会报错,因为上下文copy 失败
- 如果设置线程隔离,这里也会报错。导致安全上下问题传递不到子线程中。
- 强制使用拦截器去处理 token 转发到这里上下文,使用的业务场景只有这里,影响性能高
这三个问题,大家在使用的过程中一定会遇到
自定义OAuth2FeignRequestInterceptor
- 通过外部条件是否执行token中转
public void apply(RequestTemplate template) { Collection<String> fromHeader = template.headers().get(SecurityConstants.FROM); if (CollUtil.isNotEmpty(fromHeader) && fromHeader.contains(SecurityConstants.FROM_IN)) { return; } accessTokenContextRelay.copyToken(); if (oAuth2ClientContext != null && oAuth2ClientContext.getAccessToken() != null) { super.apply(template); } }
- 手动调用accessTokenContextRelay的copy,当然需要覆盖原生oauth 客户端的配置
总结
欢迎关注我们获得更多的好玩JavaEE 实践
© 著作权归作者所有
共有人打赏支持
上一篇: Spring的事务传播行为
相关文章 最新文章
前面几篇我们已经介绍了Spring Cloud和oauth2的知识点,今天我们要利用Spring Cloud和oauth2进行commonservice-sso服务搭建,本节我们只是搭建commonservice-sso的基础平台,闲话少说,直接将...
明理萝
2018/06/07
0
0
前面几篇我们已经介绍了Spring Cloud和oauth2的知识点,今天我们要利用Spring Cloud和oauth2进行commonservice-sso服务搭建,本节我们只是搭建commonservice-sso的基础平台,闲话少说,直接将...
SpringCloud关注者
2018/09/22
0
0
摘要:随着云计算的发展,微服务、前后端分离、DevOps逐渐成为架构主流。而不同于以往的单体应用,微服务大多仅以api形式专递信息,并且无状态(不记录用户登录状态及会话内容),这就为整个...
杨子敬的瞎扯时刻
2018/06/11
0
0
之前写了很多关于spring cloud的文章,今天我们对OAuth2.0的整合方式做一下笔记,首先我从网上找了一些关于OAuth2.0的一些基础知识点,帮助大家回顾一下知识点: 一、oauth中的角色 client:...
park
01/25
0
0
因为项目需要,调研并使用了Spring cloud oauth2.0,网上关于oauth2.0的介绍很多,包括交互的流程等等。这里,我不再介绍这些,直接深入讲解,并附上实践代码。希望能对大家有帮助。 相关链接...
菜鸟很菜
2017/04/14
0
0
没有更多内容
加载失败,请刷新页面
加载更多1.点击 Gridcontrol ---Run Desinger 2.选中Columns中的一行 选中ColumnEdit--添加DateEdit控件 3.设置显示样式 4.添加事件 repositoryItemDateEdit1_DateTimeChanged 5. 获取当前选中行的值...
黑鹰客栈
19分钟前
2
0
Spring Cloud Alibaba与Spring Boot、Spring Cloud之间不得不说的版本关系 说说我为什么看好Spring Cloud Alibaba Spring Cloud Alibaba到底坑不坑? 注册中心与配置中心:Nacos Spring Clou...
程序猿DD
21分钟前
1
0
centos7使用sendmail发送邮件 Lee_吉关注0人评论36608人阅读2017-12-29 06:08:10 一、安装: 安装sendmail: yum -y install sendmailsystemctl start sendmail 安装mailx: yum inst......
linjin200
25分钟前
1
0
前言 教学相长,分享知识,书写的同时也是在整理自己的知识点,更多是写给自己看的,如果有一丁点的帮助到他人,那么不胜荣幸。无论是资料、自己学习的总结、笔记、代码都会放进此目录。编程...
十万猛虎下画山
28分钟前
1
0
没有更多内容
加载失败,请刷新页面
加载更多以上所述就是小编给大家介绍的《Spring Cloud OAuth 实现微服务内部Token传递的源码解析 原 荐》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- ReactNative源码解析-初识源码
- Spring源码系列:BeanDefinition源码解析
- Spring源码分析:AOP源码解析(下篇)
- Spring源码分析:AOP源码解析(上篇)
- 注册中心 Eureka 源码解析 —— EndPoint 与 解析器
- 新一代Json解析库Moshi源码解析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
OKR:源于英特尔和谷歌的目标管理利器
(美) 保罗R.尼文(Paul R. Niven)、本•拉莫尔特(Ben Lamorte) / 况阳 / 机械工业出版社 / 2017-8-1 / 59.00元
内在动机驱动,而非绩效考核驱动 尤其适用快速扩张和转型期组织 谷歌、英特尔、领英、推特、星佳等硅谷知名企业成功的法宝 OKR(目标与关键结果法)是一套严密的思考框架和持续的纪律要求,旨在确保员工紧密协作,把精力聚焦在能促进组织成长的、可衡量的贡献上。 如何更好地将OKR集成到企业现有的绩效评估体系中? 如何确保OKR由高管团队来领导,而不仅仅是HR、IT或财务等职能部......一起来看看 《OKR:源于英特尔和谷歌的目标管理利器》 这本书的介绍吧!