SpringSecurity中Feign拦截器的使用

我们在接入了SpringSecurity之后,请求的时候都会在header中带上JWT令牌,这样才能访问资源。假设这样一个情景:已经完成了认证服务的认证,前端页面的header现在是带着JWT令牌的,前端需要访问A服务,而在A服务中,需要通过Feign来远程调用B服务,A、B服务都是接入了SpringSecurity的。以下为图示:
在这里插入图片描述

  • 前端请求A服务的时候,header中是带了token的,因为A服务需要认证,认证通过。
  • A服务远程调用B服务,如果不做处理的话,因为B服务也需要认证,这时A服务是无法成功调用B服务的,因为A服务的请求没带token,无法通过B服务的认证,会被SpringSecurity拦截下来,造成调用失败。

这时可以想一个办法,让token一直在header头中传递下去,可以使用Feign拦截器来实现。代码如下:

/*
 * Feign拦截器
 */
public class MyFeignClientInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate template) {
        try {
            // 获取对象
            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder
                    .getRequestAttributes();
            if (requestAttributes != null) {
                // 获取请求对象
                HttpServletRequest request = requestAttributes.getRequest();
                // 获取当前请求的header,获取到jwt令牌
                Enumeration<String> headerNames = request.getHeaderNames();
                if (headerNames != null) {
                    while (headerNames.hasMoreElements()) {
                        String headerName = headerNames.nextElement();
                        String headerValue = request.getHeader(headerName);
                        // 将header向下传递
                        template.header(headerName, headerValue);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

然后只需要将这个拦截器以Bean的形式注入到要进行远程调用的服务中,比如上面的A服务。

    //注册Feign拦截器
    @Bean
    public MyFeignClientInterceptor feignClientInterceptor() {
        return new MyFeignClientInterceptor();
    }

这样的话,只要A进行了远程调用,那么header会一直向下传递。如下图:
在这里插入图片描述

  • 前端请求A服务的时候,header中是带了token的,因为A服务需要认证,认证通过。
  • A服务中配了Feign拦截器,这个拦截器将前端请求的请求头header拦截下来了,获取token,并且将这个token放在header里面,继续传递给下一个请求。所以A服务通过Feign远程调用B服务的时候,这时header里是带了token的,B服务认证通过,A服务完成调用。
  • B服务中也配了Feign拦截器,那么header是传递下去的。B服务需要远程调用C服务,B服务请求的请求头header也带了token,C服务完成认证,B服务调用完成。

其实可以看到,像一个链条一样,一直往下传递。但是有局限性,只适用于通过Feign进行远程调用。如果是使用RestTemplate这样的第三方Http客户端来发请求,Feign拦截器是拦截不到的,需要手动将token加到请求的header中去,这点需要注意。

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值