Spring Cloud OAuth 实现微服务内部Token传递的源码解析 原 荐

栏目: 服务器 · 发布时间: 5年前

Spring Cloud OAuth 实现微服务内部Token传递的源码解析

  冷冷gg 发布于 今天 08:41

字数 739

阅读 11

收藏 0

Spring OAuth Spring Cloud

八年 Java 开发的感悟:什么才是 程序员 的立身之本 >>> Spring Cloud OAuth 实现微服务内部Token传递的源码解析 原 荐

背景分析

Spring Cloud OAuth 实现微服务内部Token传递的源码解析 原 荐

本文主要来探讨第三部 A --> B ,token 自定维护的源码实现

如何实现token 传递

配置OAuth2FeignRequestInterceptor 即可

  • 此类是Feign 的拦截器实现

Spring Cloud OAuth 实现微服务内部Token传递的源码解析 原 荐

@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 Cloud OAuth 实现微服务内部Token传递的源码解析 原 荐

源码非常简单

谈谈spring security oauth 实现的问题

  1. 当请求上线文没有Token,如果调用feign 会直接,这个OAuth2FeignRequestInterceptor 肯定会报错,因为上下文copy 失败
  2. 如果设置线程隔离,这里也会报错。导致安全上下问题传递不到子线程中。
  3. 强制使用拦截器去处理 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 客户端的配置 Spring Cloud OAuth 实现微服务内部Token传递的源码解析 原 荐

总结

Spring Cloud OAuth 实现微服务内部Token传递的源码解析 原 荐

欢迎关注我们获得更多的好玩JavaEE 实践

© 著作权归作者所有

共有人打赏支持

上一篇: Spring的事务传播行为

下一篇: 【长文】Spring Cloud OAuth Token 生成源码解析

Spring Cloud OAuth 实现微服务内部Token传递的源码解析 原 荐

冷冷gg

粉丝 545

博文 124

码字总数 63432

作品 1

潍坊

UI设计师

提问

相关文章 最新文章

Spring Cloud云架构 - commonservice-sso服务搭建(一)

前面几篇我们已经介绍了Spring Cloud和oauth2的知识点,今天我们要利用Spring Cloud和oauth2进行commonservice-sso服务搭建,本节我们只是搭建commonservice-sso的基础平台,闲话少说,直接将...

明理萝

2018/06/07

0

0

(十五) 整合spring cloud云架构 - commonservice-sso服务搭建(一)

前面几篇我们已经介绍了Spring Cloud和oauth2的知识点,今天我们要利用Spring Cloud和oauth2进行commonservice-sso服务搭建,本节我们只是搭建commonservice-sso的基础平台,闲话少说,直接将...

SpringCloud关注者

2018/09/22

0

0

SpringCloud实践分享-OAuth2认证中心(待完成)

摘要:随着云计算的发展,微服务、前后端分离、DevOps逐渐成为架构主流。而不同于以往的单体应用,微服务大多仅以api形式专递信息,并且无状态(不记录用户登录状态及会话内容),这就为整个...

杨子敬的瞎扯时刻

2018/06/11

0

0

(十)Java B2B2C多用户商城 springcloud架构-SSO单点登录之OAuth2.0登录认证(1)

之前写了很多关于spring cloud的文章,今天我们对OAuth2.0的整合方式做一下笔记,首先我从网上找了一些关于OAuth2.0的一些基础知识点,帮助大家回顾一下知识点: 一、oauth中的角色 client:...

park

01/25

0

0

Spring cloud oauth2.0学习总结

因为项目需要,调研并使用了Spring cloud oauth2.0,网上关于oauth2.0的介绍很多,包括交互的流程等等。这里,我不再介绍这些,直接深入讲解,并附上实践代码。希望能对大家有帮助。 相关链接...

菜鸟很菜

2017/04/14

0

0

Spring Cloud OAuth 实现微服务内部Token传递的源码解析 原 荐

没有更多内容

加载失败,请刷新页面

加载更多
C# DevExpress gridcontrol添加DateEdit 并获取选中的值

1.点击 Gridcontrol ---Run Desinger 2.选中Columns中的一行 选中ColumnEdit--添加DateEdit控件 3.设置显示样式 4.添加事件 repositoryItemDateEdit1_DateTimeChanged 5. 获取当前选中行的值...

黑鹰客栈

19分钟前

2

0

Spring Cloud OAuth 实现微服务内部Token传递的源码解析 原 荐
Flink、Storm与Spark Stream的区别(未)

http://www.dataguru.cn/article-9532-1.html

无精疯

20分钟前

0

0

《Spring Cloud Alibaba基础教程》连载目录

Spring Cloud Alibaba与Spring Boot、Spring Cloud之间不得不说的版本关系 说说我为什么看好Spring Cloud Alibaba Spring Cloud Alibaba到底坑不坑? 注册中心与配置中心:Nacos Spring Clou...

程序猿DD

21分钟前

1

0

centos7使用sendmail发送邮件

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

Spring Cloud OAuth 实现微服务内部Token传递的源码解析 原 荐
php目录

前言 教学相长,分享知识,书写的同时也是在整理自己的知识点,更多是写给自己看的,如果有一丁点的帮助到他人,那么不胜荣幸。无论是资料、自己学习的总结、笔记、代码都会放进此目录。编程...

十万猛虎下画山

28分钟前

1

0

没有更多内容

加载失败,请刷新页面

加载更多

以上所述就是小编给大家介绍的《Spring Cloud OAuth 实现微服务内部Token传递的源码解析 原 荐》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

中国网络媒体的第一个十年

中国网络媒体的第一个十年

彭兰 / 清华大学出版社 / 2005-7 / 35.00元

此书对中国网络媒体的第一个十年这一重要的历史阶段首次进行了全景式、全程式的历史记录,并进行了全面深入的研究,在一定程度上填补了中国网络媒体发展史宏观研究方面的空白。对于网络新闻传播的研究,以及当代中国媒体发展的研究.具有重要的意义。 ——方汉奇 图书目录 绪论 1 第一章 投石问路:中国网络媒体萌芽(1994一1995年) 9 第一节 从实验室走向市场:互联网兴起 10 ......一起来看看 《中国网络媒体的第一个十年》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器

MD5 加密
MD5 加密

MD5 加密工具