Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring Cloud中Feign如何统一设置验证token

Spring Cloud中Feign如何统一设置验证token

作者头像
hbbliyong
发布于 2019-05-25 10:47:40
发布于 2019-05-25 10:47:40
2.4K00
代码可运行
举报
文章被收录于专栏:hbbliyonghbbliyong
运行总次数:0
代码可运行

代码地址:https://github.com/hbbliyong/springcloud.git

原理是通过每个微服务请求之前都从认证服务获取认证之后的token,然后将token放入到请求头中带过去,这样被调用方通过验证token来判断是否合法请求

我们也在zuul中通过前置过滤器来统一设置token, 其实还漏掉了一种,那就是业务服务调用业务服务的时候,是没有zuul这种前置过滤器的,那么我们该如何设置呢?

其实也挺简单的,因为我们服务之前的调用是依赖于Feign的,我们可以从Feign上来做文章

如果你仔细看过Feign的文档的话,肯定会注意到下面一段代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tatic class DynamicAuthTokenTarget<T> implements Target<T> {
public DynamicAuthTokenTarget(Class<T> clazz,
UrlAndTokenProvider provider,
ThreadLocal<String> requestIdProvider);
...
@Override
public Request apply(RequestTemplate input) {
TokenIdAndPublicURL urlAndToken = provider.get();
if (input.url().indexOf("http") != 0) {
input.insert(0, urlAndToken.publicURL);
}
input.header("X-Auth-Token", urlAndToken.tokenId);
input.header("X-Request-ID", requestIdProvider.get());

return input.request();
}
}
...
Bank bank = Feign.builder()
.target(new DynamicAuthTokenTarget(Bank.class, provider, requestIdProvider));

我们可以为Feign设置一个请求拦截器,在调用之前做一些事情,添加请求头信息

原生的Feign都能添加拦截器,Spring Cloud中那肯定也是可以的

前面的文章中我们讲过通过自定义配置来覆盖默认配置,我们创建了一个FeignConfiguration配置类来配置Feign的日志

今天终于又派上用场了, 可以在这边自定义一个拦截器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class FeignConfiguration {
/**
* 日志级别
* @return
*/
@Bean 
Logger.Level feignLoggerLevel() { 
return Logger.Level.FULL; 
}

/**
* 创建Feign请求拦截器,在发送请求前设置认证的token,各个微服务将token设置到环境变量中来达到通用
* @return
*/
@Bean
public FeignBasicAuthRequestInterceptor basicAuthRequestInterceptor() {
return new FeignBasicAuthRequestInterceptor();
}

}

/**
* Feign请求拦截器
* @author yinjihuan
* @create 2017-11-10 17:25
**/
public class FeignBasicAuthRequestInterceptor implements RequestInterceptor {

public FeignBasicAuthRequestInterceptor() {

}

@Override
public void apply(RequestTemplate template) {
template.header("Authorization", System.getProperty("fangjia.auth.token"));
}
}

大致的步骤呢就是通过设置Feign的拦截器来设置token, 因为这边是通用的,所有呢token的值通过环境变量来传递

每个微服务只需要将获取的token信息设置到环境变量中即可

System.setProperty("fangjia.auth.token", token); 上次我们也讲过如果来自动获取token,我们是通过定时任务来定时刷新的,当时还创建了AuthService来获取token

今天在优化下,因为这个也需要通用,所以直接将Service去掉了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
* 定时刷新token
*
* @author yinjihuan
* @create 2017-11-09 15:39
**/
@Component
public class TokenScheduledTask {
private static Logger logger = LoggerFactory.getLogger(TokenScheduledTask.class);

public final static long ONE_Minute = 60 * 1000 * 60 * 20;

@Autowired
private AuthRemoteClient authRemoteClient;

/**
* 刷新Token
*/
@Scheduled(fixedDelay = ONE_Minute)
public void reloadApiToken() {
String token = this.getToken();
while (StringUtils.isBlank(token)) {
try {
Thread.sleep(1000);
token = this.getToken();
} catch (InterruptedException e) {
logger.error("", e);
}
}
System.setProperty("fangjia.auth.token", token);
}

public String getToken() {
AuthQuery query = new AuthQuery();
query.setAccessKey("1");
query.setSecretKey("1");
ResponseData response = authRemoteClient.auth(query);
return response.getData() == null ? "" : response.getData().toString();
}
}

到现在,各个微服务直接的安全认证就结束啦,用起来不麻烦,下面总结下

定义一个用于认证的微服务,可以有用户信息,和业务无关,提供认证接口 定义JWT工具类,提供生成token和检查token的方法,公用 定义认证token的过滤器,公用 在需要认证的微服务中注册过滤器即可实现拦截操作, 也可做成公用的,就是所有都需要认证 在调用方配置TokenScheduledTask,实现定时刷新token, 也可做成公用的 如果不需要认证,那么不注册拦截过滤器即可,也不用 TokenScheduledTask,对业务代码无任何倾入性

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-04-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Cloud中Feign如何统一设置验证token
原理是通过每个微服务请求之前都从认证服务获取认证之后的token,然后将token放入到请求头中带过去,这样被调用方通过验证token来判断是否合法请求。
猿天地
2018/07/25
2.5K0
Spring Cloud中Feign如何统一设置验证token
前面我们大致的聊了下如何保证各个微服务之前调用的认证问题 Spring Cloud中如何保证各个微服务之间调用的安全性 Spring Cloud中如何保证各个微服务之间调用的安全性(下篇) 原理是通过每个微服务请求之前都从认证服务获取认证之后的token,然后将token放入到请求头中带过去,这样被调用方通过验证token来判断是否合法请求 我们也在zuul中通过前置过滤器来统一设置token, 其实还漏掉了一种,那就是业务服务调用业务服务的时候,是没有zuul这种前置过滤器的,那么我们该如何设置呢? 其实
猿天地
2018/04/03
2.2K0
Spring Cloud中Feign如何统一设置验证token
面试系列之-分布式统一设置验证token
在 Feign 客户端中,我们可以通过实现 RequestInterceptor 接口来实现拦截器。在拦截器中,我们可以设置请求头信息来携带 token。
用户4283147
2023/11/20
3690
面试系列之-分布式统一设置验证token
Spring Cloud中如何保证各个微服务之间调用的安全性(下篇)
今天我们继续接着上篇文章来聊一聊如何能够在调用方实现token的自动设置以及刷新。
猿天地
2018/07/25
7930
Spring Cloud中如何保证各个微服务之间调用的安全性
一.背景 微服务架构下,我们的系统根据业务被拆分成了多个职责单一的微服务。 每个服务都有自己的一套API提供给别的服务调用,那么如何保证安全性呢? 不是说你想调用就可以调用,一定要有认证机制,是我们内部服务发出的请求,才可以调用我们的接口。 需要注意的是我们这边讲的是微服务之间调用的安全认证,不是统一的在API官网认证,需求不一样,API网关处的统一认证是和业务挂钩的,我们这边是为了防止接口被别人随便调用。 二.方案 OAUTH2 Spring Cloud可以使用OAUTH2来实现多个微服务的统一认证授权
猿天地
2018/04/03
3.1K0
使用 Feign 实现微服务之间的认证和授权
在微服务架构中,认证和授权是保障系统安全和可靠性的重要手段。使用Feign实现微服务之间的认证和授权,可以有效地提高系统的安全性和可维护性。
堕落飞鸟
2023/04/08
4.2K2
深入微服务-SpringCloud调用组件Feign
本系列带着大家深入微服务 Spring体系的各个框架的底层原理。上一篇文章介绍了SpringBoot自动装配原理,本节将带着大家熟悉下SpringCloud体系的调用组件Feign
janyxe
2022/04/27
5970
深入微服务-SpringCloud调用组件Feign
SpringCloud调用组件Feign
本系列带着大家深入微服务 Spring体系的各个框架的底层原理。上一篇文章介绍了SpringBoot自动装配原理,本节将带着大家熟悉下SpringCloud体系的调用组件Feign
闻说社
2025/04/08
1560
SpringCloud调用组件Feign
Spring Cloud中如何优雅的使用Feign调用接口
JAVA 项目中接口调用怎么做 ? Httpclient Okhttp Httpurlconnection RestTemplate 上面是最常见的几种用法,我们今天要介绍的用法比上面的更简单,方便,它就是 Feign Feign是一个声明式的REST客户端,它的目的就是让REST调用更加简单。 Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。 而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关
猿天地
2018/04/03
3K0
Spring Cloud Feign如何实现JWT令牌中继以传递认证信息
令牌中继(Token Relay)是比较正式的说法,说白了就是让Token令牌在服务间传递下去以保证资源服务器能够正确地对调用方进行鉴权。
码农小胖哥
2021/11/02
1.6K0
Feign拦截器熔断机制踩坑?
事情是这样的,今天调试调用一个微服务的项目,但是发现在调用的过程中发现内部调用服务的时候 token 没有传递过去。
技术从心
2021/01/18
1.9K0
Feign拦截器熔断机制踩坑?
微服务的用户认证与授权杂谈(下)
在微服务的用户认证与授权杂谈(上)一文中简单介绍了微服务下常见的几种认证授权方案,并且使用JWT编写了一个极简demo来模拟Token的颁发及校验。而本文的目的主要是延续上文来补充几个要点,例如Token如何在多个微服务间进行传递,以及如何利用AOP实现登录态和权限的统一校验。
端碗吹水
2020/09/23
7620
微服务的用户认证与授权杂谈(下)
微服务架构-实现技术之具体实现工具与框架5:Spring Cloud Feign与Ribbon原理与注意事项
二、FeignClent注解剖析+Spring Cloud Feign基本功能配置解读
全栈程序员站长
2022/08/11
4320
微服务架构-实现技术之具体实现工具与框架5:Spring Cloud Feign与Ribbon原理与注意事项
springcloud系列之-快速上手feign
Feign是一个声明式WebService客户端.使用Feign能让编写WebService客户端更加简单,它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解.Feign也支持可拔插式的编码器和解码器,feign是可以单独使用的,然后springcloud集成了feign之后,为了使feign的使用风格与springmvc使用的风格一致,于是对feign进行了封装,使feign支持了getmapping,postmapping这样注解的调用方式,让调用方式更加统一。
AI码师
2020/11/19
1.1K0
springcloud系列之-快速上手feign
spring cloud服务间调用之feign
在微服务架构盛行的年代,我们将一个大型的系统,拆解成各个服务,要完成一个业务逻辑,就可能需要,调用不同服务。比如订单服务调用会员服务。当然我们可以使用JDK自带的URLConnection,或者Apache的Http Client来调用,但是最为优雅的使用feign。
丁D
2022/08/12
1K0
spring cloud服务间调用之feign
Spring Cloud OAuth 微服务内部Token传递的源码实现解析
背景分析 [20190414113622_whRvQH_have-token.jpeg] 1.客户端携带认证中心发放的token,请求资源服务器A(Spring Security OAuth 发放Token 源码解析) 2.客户端携带令牌直接访问资源服务器,资源服务器通过对token 的校验 (Spring Cloud OAuth2 资源服务器CheckToken 源码解析 ) 判断用户的合法性,并保存到上下文中 3.A服务接口接收到请求,需要通过Feign或者其他RPC框架调用B服务来组装返回数据 本文主
冷冷
2019/04/17
2.9K0
Spring Cloud 微服务架构学习笔记与示例
本文示例基于Spring Boot 1.5.x实现,如对Spring Boot不熟悉,可以先学习我的这一篇:《Spring Boot 1.5.x 基础学习示例》。关于微服务基本概念不了解的童鞋,可以先阅读下始祖Martin Fowler的《Microservice》,本文不做介绍和描述。
Edison Zhou
2018/09/27
1.2K0
Spring Cloud 微服务架构学习笔记与示例
Spring Boot 如何集成JWT实现Token验证
近年来,随着前后端分离、微服务等架构的兴起,传统的cookie+session身份验证模式已经逐渐被基于Token的身份验证模式取代。接下来介绍如何在Spring Boot项目中集成JWT实现Token验证。
章为忠学架构
2023/03/23
6.9K0
Spring Boot 如何集成JWT实现Token验证
spring cloud 配置zuul实用
前面我们通过Ribbon或Feign实现了微服务之间的调用和负载均衡,那我们的各种微服务又要如何提供给外部应用调用呢。
爱撸猫的杰
2019/03/28
5830
spring cloud 配置zuul实用
Spring Cloud 7.2: 使用 Feign 进行服务间调用的会话保持
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
bug菌
2025/01/09
4190
Spring Cloud 7.2: 使用 Feign 进行服务间调用的会话保持
推荐阅读
相关推荐
Spring Cloud中Feign如何统一设置验证token
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验