前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面试系列之-分布式统一设置验证token

面试系列之-分布式统一设置验证token

作者头像
用户4283147
发布于 2023-11-20 06:59:26
发布于 2023-11-20 06:59:26
34300
代码可运行
举报
文章被收录于专栏:对线JAVA面试对线JAVA面试
运行总次数:0
代码可运行
Spring Cloud Feign统一设置验证token实现方法解析

实现Feign的拦截器RequestInterceptor

在 Feign 客户端中,我们可以通过实现 RequestInterceptor 接口来实现拦截器。在拦截器中,我们可以设置请求头信息来携带 token。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
public class FeignClientInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate requestTemplate) {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication != null && authentication instanceof OAuth2Authentication) {
            OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) authentication.getDetails();
            requestTemplate.header(HttpHeaders.AUTHORIZATION, "Bearer " + details.getTokenValue());
        }
    }
}

通过 SecurityContextHolder 来获取当前的身份验证信息,并从中提取出 token 值。然后通过 RequestTemplate 来设置请求头信息,从而携带 token。

启用 Feign 客户端拦截器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
feign:
  client:
    config:
      default:
        interceptor: com.example.FeignClientInterceptor
基于微服务网关gateway的token认证机制
自定义过滤器

可以继承 AbstractGatewayFilterFactory 或实现 GlobalFilter 实现过滤请求功能

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
 
@Component
public class AuthGatewayFilterFactory extends AbstractGatewayFilterFactory<AuthGatewayFilterFactory.Config> {
 
    public AuthGatewayFilterFactory() {
        super(Config.class);
    }
 
    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            System.out.println("Welcome to AuthFilter.");
            String token = exchange.getRequest().getHeaders().getFirst("sign");
            if (Config.secret.equals(token)) {
                return chain.filter(exchange);
            }
            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        };
    }
 
    static class Config {
        static String secret = "1234";
    }
}
GlobalFilter

GlobalFilter 可以在全局应用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
 
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("Welcome to AuthGlobalFilter.");
        ServerHttpRequest request = exchange.getRequest();
        String sign = request.getHeaders().get("sign").get(0);
        String token = "1234";
        if(token.equals(sign)) {
            return chain.filter(exchange);
        }
        ServerHttpResponse response = exchange.getResponse();
        response.setStatusCode(HttpStatus.UNAUTHORIZED);
        return response.setComplete();
    }
 
    @Override
    public int getOrder() {
        return 0;
    }
}
基于第三方认证服务来进行认证
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 对线JAVA面试 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
Golang中time包用法--转
time包中包括两类时间:时间点(某一时刻)和时常(某一段时间) 1时间常量(时间格式化) const ( ANSIC = "Mon Jan _2 15:04:05 2006" UnixDate = "Mon Jan _2 15:04:05 MST 2006" RubyDate = "Mon Jan 02 15:04:05 -0700 2006" RFC822 = "02 Jan 06 15:04 MST" RFC822Z = "02
李海彬
2018/03/20
4.2K0
记一次使用time.Duration类型踩过的坑
大家好,我是渔夫子。今天跟大家聊聊time. Duration类型及其使用。为什么要讲这个呢,是因为最近在写代码时踩到了一个坑,为了避免大家在今后也踩同样的坑,就跟大家聊聊该类型的使用。
Go学堂
2023/01/31
7040
time 用法大全
type Duration int64 持续时间表示两个瞬间之间的经过时间,为int64纳秒计数。
酷走天涯
2019/05/26
1.2K0
Golang内置包-time
时间离我们仅在咫尺,无论是在编程中时间还是日常生活中对于时间的 记述都是离我们最近的,那么让我们一起来学习一下GoLang中内置包time。
PayneWu
2020/12/18
8760
微服务-高并发下接口如何做到优雅的限流
通俗的来讲,一根管子往池塘注水,池塘底部有一个口子往外出水,当注水的速度过快时,池塘的水会溢出,此时,我们的做法换根小管子注水或者把注水管子的口堵住一半,这就是限流,限流的目的就是为了防止池塘的水溢出,放在软件开发中,一台硬件的CPU和内存总归是有限的,能处理的请求量是有一个阈值的,就跟人的精力一样是有限的,超过这个限度系统就会异常,人就会生病。
阿伟
2020/03/26
1.1K0
【Golang】理解Golang中的time.Duration
Duration 将两个瞬间之间的经过时间表示为 int64 纳秒计数。 该表示将最大可表示持续时间限制为大约 290 年。
唯一Chat
2022/07/24
2.8K0
Go语言计时器的使用详解
Go语言的标准库里提供两种类型的计时器Timer和Ticker。Timer经过指定的duration时间后被触发,往自己的时间channel发送当前时间,此后Timer不再计时。Ticker则是每隔duration时间都会把当前时间点发送给自己的时间channel,利用计时器的时间channel可以实现很多与计时相关的功能。
KevinYan
2020/05/14
2.4K0
Go 定时器:Timer 和 Ticker
在日常开发中,我们可能会遇到需要延迟执行或周期性地执行一些任务。这个时候就需要用到 Go 语言中的定时器。
陈明勇
2024/01/23
1.6K6
Go 定时器:Timer 和 Ticker
Go之time包用法
time包提供了时间的显示和测量用的函数。日历的计算采用的是公历。 time 类型 type Time struct { // wall and ext encode the wall time seconds, wall time nanoseconds, // and optional monotonic clock reading in nanoseconds. // // From high to low bit position, wall encodes a 1-bit flag (hasMon
孤烟
2022/03/19
3980
Golang之时间、日期类型
孤身只影的一直小地鼠,艰难的走在路上 package main import ( "fmt" "time" ) //获取时间的格式 func testTime() { now := time.Now() fmt.Printf("current time:%v\n", now) year := now.Year() month := now.Month() day := now.Day() hour := now.Hour() mi
超蛋lhy
2018/08/31
4.1K0
Golang包——time
毫秒和纳秒是两的时间单位 1秒=1000毫秒 1毫秒=1000微秒 1微秒=1000纳秒
羊羽shine
2019/05/29
1.2K0
一文搞懂Go语言标准库,Time
在编程过程中,我们经常会用到与时间和日期相关的各种需求,下面来介绍 Go 语言中有关时间的一些基本用法。
微客鸟窝
2021/12/27
5440
GO的定时器Timer 和定时任务cron
要是对GO 中 swaggo 的应用还有点兴趣的话,可以查看文章 工作中后端是如何将API提供出去的?swaggo很不错
阿兵云原生
2023/02/16
1.2K0
golang 定时器封装——支持超时和函数自定义
如标题,封装一个golang的定时器,能够设置超时时间和定时器的interval。开启定时器后使用一个新的goroutine进行倒计时操作。
Java架构师必看
2021/05/14
5730
Golang之旅21-time模块使用
time.Time类型表示时间。我们可以通过time.Now()函数获取当前的时间对象,然后获取时间对象的年、月、日、时、分、秒等信息。
皮大大
2021/03/02
5190
go的日期操作类使用-日常使用类库no.1
我这里接下来的几个文章主要是讲解日常的业务中或者代码中使用的类库,下面我们来看代码。
公众号-利志分享
2022/04/25
3470
Golang深入浅出之-Go语言中的时间与日期处理:time包详解
在Go语言中,time包提供了丰富而强大的功能来处理时间和日期,这对于构建精确计时、定时任务、日期格式化等应用场景至关重要。本文将深入浅出地探讨time包的核心概念、常见问题、易错点及其规避策略,并通过实用代码示例加深理解。
Jimaks
2024/04/29
1.9K0
分布式高并发系统限流原理与实践
随着业务的发展壮大,对后端服务的压力也会越来越大,为了打造高效稳定的系统, 产生了分布式,微服务等等系统设计,因为这个原因,设计复杂度也随之增加,基于此 诞生了高并发系统三大利器限流,缓存,降级/熔断。
merlinfeng
2020/12/31
8570
分布式高并发系统限流原理与实践
k8s 中定时任务的实现
k8s 中有许多优秀的包都可以在平时的开发中借鉴与使用,比如,任务的定时轮询、高可用的实现、日志处理、缓存使用等都是独立的包,可以直接引用。本篇文章会介绍 k8s 中定时任务的实现,k8s 中定时任务都是通过 wait 包实现的,wait 包在 k8s 的多个组件中都有用到,以下是 wait 包在 kubelet 中的几处使用:
田飞雨
2019/12/19
1.5K0
Go定时任务实现
定时任务调度是常见的场景,从简单点本地任务调度,到分布式定时任务调度,被广泛的使用。本文汇总了 awesome-go 里全部的本地定时任务库,并横向对比其实现原理,以及使用场景和优缺点,欢迎收藏随时参考。
味笼
2023/02/26
1.3K0
相关推荐
Golang中time包用法--转
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • Spring Cloud Feign统一设置验证token实现方法解析
    • 实现Feign的拦截器RequestInterceptor
    • 启用 Feign 客户端拦截器
  • 基于微服务网关gateway的token认证机制
    • 自定义过滤器
    • GlobalFilter
  • 基于第三方认证服务来进行认证
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档