Spring Cloud之Feign调用token丢失

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/xufei_0320/article/details/78551934

开始前

在Spring Cloud中,我想大家对于Feign应该不陌生了吧。这里就不作介绍了。

之前在多个群里都看到有人在问这样一个问题,在加了授权认证之后,不管是JWT也好,Security也好,Feign调用总是没有权限。

其实我们知道不管是选择哪种,最终token都是放在请求头里面,访问时携带以通过认证。

可是当使用Feign时就会发现这样一个问题,外部请求到A服务的时候,A服务是可以拿到token(认证信息)的,然而当A使用Feign调用B服务时,token就会丢失,进而认证失败,权限不足。

解决方式

这时候我们需要做的就是在Feign调用的时候,向其请求头里面添加上我们的token

我们需要实现Feign提供的一个接口RequestInterceptor

这里简单实现一下,假设我们在验证权限的时候放在请求头里面的就叫token,我们先获取当前请求中的token,然后放到Feign的请求头上,当然具体还是要根据你们的业务来

public class FeignConfig implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate requestTemplate) {
        requestTemplate.header("token", getHeaders(getHttpServletRequest()).get("token"));
    }

    private HttpServletRequest getHttpServletRequest() {
        try {
            return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        } catch (Exception e) {
            return null;
        }
    }

    private Map<String, String> getHeaders(HttpServletRequest request) {
        Map<String, String> map = new LinkedHashMap<>();
        Enumeration<String> enumeration = request.getHeaderNames();
        while (enumeration.hasMoreElements()) {
            String key = enumeration.nextElement();
            String value = request.getHeader(key);
            map.put(key, value);
        }
        return map;
    }
}

这里就简单实现了一个RequestInterceptor,但是怎么用呢,其实很简单,我们在@FeignClient注解里面的属性加上configuration = FeignConfig.class就可以了

@FeignClient(value = "oss-server", configuration = FeignConfig.class)
public interface OssClient {

}

这时候再调用就会发现已经携带token了。

最后

其实实现了RequestInterceptor后,直接使用@Configuration注解,不在FeignClient里面加属性也是可以的。

这个相对还是比较简单的,代码就不上了。

猜你喜欢

转载自blog.csdn.net/xufei_0320/article/details/78551934