广告
返回顶部
首页 > 资讯 > 精选 >spring cloud oauth2 feign遇到的坑怎么解决
  • 899
分享到

spring cloud oauth2 feign遇到的坑怎么解决

2023-06-29 10:06:15 899人浏览 泡泡鱼
摘要

本篇内容主要讲解“spring cloud oauth2 feign遇到的坑怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spring cloud

本篇内容主要讲解“spring cloud oauth2 feign遇到的坑怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spring cloud oauth2 feign遇到的坑怎么解决”吧!

spring cloud oauth3 feign 遇到的坑

关于oauth3相关的内容这里不重复描述,在spring cloud中在管理内部api时鉴权相信有很多人会有疑问,这里描述两种比较low的用法。

客户端模式

提供三方jar包

spring cloud oauth2 feign遇到的坑怎么解决

这里需要抽一个jar包,需要用到feign的为服务端直接利用Maven模式引入feign即可

<dependencies>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-feign</artifactId>        </dependency>        <dependency>            <groupId>com.netflix.feign</groupId>            <artifactId>feign-okHttp</artifactId>            <version>8.18.0</version>        </dependency>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-oauth3</artifactId>        </dependency>    </dependencies>

核心类

  • CustomHystrixConcurrencyStrategy.java

  • Oauth3ClientProperties.java

  • OAuth3FeignAutoConfiguration.java

  • OAuth3FeignRequestInterceptor.java

package com.paascloud.security.feign;import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;@Data@ConfigurationProperties(prefix = "paascloud.oauth3.client")public class Oauth3ClientProperties {    private String id;    private String accessTokenUrl;    private String clientId;    private String clientSecret;    private String clientAuthenticationScheme;}
package com.paascloud.security.feign;import com.netflix.hystrix.strategy.HystrixPlugins;import com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategy;import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;import org.springframework.stereotype.Component;import java.util.concurrent.Callable;@Componentpublic class CustomHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy {        public CustomHystrixConcurrencyStrategy() {        HystrixPlugins.getInstance().reGISterConcurrencyStrategy(this);    }        @Override    public <T> Callable<T> wrapCallable(Callable<T> callable) {        return new HystrixContextWrapper<T>(callable);    }        public static class HystrixContextWrapper<V> implements Callable<V> {        private HystrixRequestContext hystrixRequestContext;        private Callable<V> delegate;                HystrixContextWrapper(Callable<V> delegate) {        this.hystrixRequestContext = HystrixRequestContext.getContextForCurrentThread();            this.delegate = delegate;        }                @Override        public V call() throws Exception {            HystrixRequestContext existingState = HystrixRequestContext.getContextForCurrentThread();            try {                HystrixRequestContext.setContextOnCurrentThread(this.hystrixRequestContext);                return this.delegate.call();            } finally {                HystrixRequestContext.setContextOnCurrentThread(existingState);            }        }    }}
package com.paascloud.security.feign;import feign.Logger;import feign.RequestInterceptor;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.http.client.Netty4ClientHttpRequestFactory;import org.springframework.security.oauth3.client.DefaultOAuth3ClientContext;import org.springframework.security.oauth3.client.OAuth3RestTemplate;import org.springframework.security.oauth3.client.token.grant.client.ClientCredentialsResourceDetails;import org.springframework.security.oauth3.common.AuthenticationScheme;@Configuration@EnableConfigurationProperties(Oauth3ClientProperties.class)public class OAuth3FeignAutoConfiguration {    private final Oauth3ClientProperties oauth3ClientProperties;        @Autowired    public OAuth3FeignAutoConfiguration(Oauth3ClientProperties oauth3ClientProperties) {        this.oauth3ClientProperties = oauth3ClientProperties;    }        @Bean("paascloudClientCredentialsResourceDetails")    public ClientCredentialsResourceDetails resourceDetails() {        ClientCredentialsResourceDetails details = new ClientCredentialsResourceDetails();        details.setId(oauth3ClientProperties.getId());        details.setAccessTokenUri(oauth3ClientProperties.getAccessTokenUrl());        details.setClientId(oauth3ClientProperties.getClientId());        details.setClientSecret(oauth3ClientProperties.getClientSecret());        details.setAuthenticationScheme(AuthenticationScheme.valueOf(oauth3ClientProperties.getClientAuthenticationScheme()));        return details;    }        @Bean("paascloudOAuth3RestTemplate")    public OAuth3RestTemplate oAuth3RestTemplate() {        final OAuth3RestTemplate oAuth3RestTemplate = new OAuth3RestTemplate(resourceDetails(), new DefaultOAuth3ClientContext());        oAuth3RestTemplate.setRequestFactory(new Netty4ClientHttpRequestFactory());        return oAuth3RestTemplate;    }        @Bean    public RequestInterceptor oauth3FeignRequestInterceptor(@Qualifier("paascloudOAuth3RestTemplate") OAuth3RestTemplate oAuth3RestTemplate) {        return new OAuth3FeignRequestInterceptor(oAuth3RestTemplate);    }        @Bean    Logger.Level feignLoggerLevel() {        return Logger.Level.FULL;    }}
package com.paascloud.security.feign;import feign.RequestInterceptor;import feign.RequestTemplate;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.security.oauth3.client.OAuth3RestTemplate;import org.springframework.util.Assert;public class OAuth3FeignRequestInterceptor implements RequestInterceptor {    private static final String AUTHORIZATION_HEADER = "Authorization";    private static final String BEARER_TOKEN_TYPE = "bearer";    private final OAuth3RestTemplate oAuth3RestTemplate;        OAuth3FeignRequestInterceptor(OAuth3RestTemplate oAuth3RestTemplate) {        Assert.notNull(oAuth3RestTemplate, "Context can not be null");        this.oAuth3RestTemplate = oAuth3RestTemplate;    }        @Override    public void apply(RequestTemplate template) {        template.header(AUTHORIZATION_HEADER, String.fORMat("%s %s", BEARER_TOKEN_TYPE,  oAuth3RestTemplate.getAccessToken().toString()));    }}

调用端配置

引入maven依赖

<dependency>            <groupId>com.liuzm.paascloud.common</groupId>            <artifactId>paascloud-security-feign</artifactId>            <version>1.0-SNAPSHOT</version></dependency>

@FeignClient加入configuration属性

@FeignClient(value = "paascloud-provider-mdc", configuration = OAuth3FeignAutoConfiguration.class, fallback = MdcProductFeignHystrix.class)public interface MdcProductFeignApi {        @RequestMapping(value = "/api/product/updateProductStockById", method = RequestMethod.POST)    int updateProductStockById(@RequestBody ProductDto productDto);}

认证服务器配置

@Override    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {        clients.withClientDetails(restClientDetailsService);    }
package com.paascloud.provider.security;import com.paascloud.security.core.properties.OAuth3ClientProperties;import com.paascloud.security.core.properties.SecurityProperties;import org.apache.commons.lang3.ArrayUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.security.oauth3.config.annotation.builders.InMemoryClientDetailsServiceBuilder;import org.springframework.security.oauth3.provider.ClientDetails;import org.springframework.security.oauth3.provider.ClientDetailsService;import org.springframework.security.oauth3.provider.ClientRegistrationException;import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component("restClientDetailsService")public class RestClientDetailsServiceImpl implements ClientDetailsService {    private ClientDetailsService clientDetailsService;    @Autowired    private SecurityProperties securityProperties;        @PostConstruct    public void init() {        InMemoryClientDetailsServiceBuilder builder = new InMemoryClientDetailsServiceBuilder();        if (ArrayUtils.isNotEmpty(securityProperties.getOauth3().getClients())) {            for (OAuth3ClientProperties client : securityProperties.getOauth3().getClients()) {                builder.withClient(client.getClientId())                        .secret(client.getClientSecret())                        .authorizedGrantTypes("refresh_token", "passWord", "client_credentials")                        .accessTokenValiditySeconds(client.getAccessTokenValidateSeconds())                        .refreshTokenValiditySeconds(2592000)                        .scopes(client.getScope());            }        }        try {            clientDetailsService = builder.build();        } catch (Exception e) {            e.printStackTrace();        }    }        @Override    public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {        return  clientDetailsService.loadClientByClientId(clientId);    }}

bootstrap.yml配置

security:    oauth3:      tokenStore: Jwt      clients[0]:        clientId: paascloud-client-uac        clientSecret: paascloudClientSecret        accessTokenValidateSeconds: 7200        scope: "*"      clients[1]:        clientId: paascloud-browser        clientSecret: paascloudClientSecret        accessTokenValidateSeconds: 7200        scope: "*"      clients[2]:        clientId: paascloud-client-gateway        clientSecret: paascloudClientSecret        accessTokenValidateSeconds: 7200        scope: "*"      clients[3]:        clientId: paascloud-client-zipkin        clientSecret: paascloudClientSecret        accessTokenValidateSeconds: 7200        scope: "*"      clients[4]:        clientId: paascloud-client-mdc        clientSecret: paascloudClientSecret        accessTokenValidateSeconds: 7200        scope: "*"      clients[5]:        clientId: paascloud-client-omc        clientSecret: paascloudClientSecret        accessTokenValidateSeconds: 7200        scope: "*"      clients[6]:        clientId: paascloud-client-opc        clientSecret: paascloudClientSecret        accessTokenValidateSeconds: 7200        scope: "*"

到此客户端模式配置完成!

基于spring security

开放权限,利用url规范来规划客户端的url不通过auth3鉴权,这里唯一的区别是在feign拦截器里处理的逻辑改一下,代码如下

@Autowiredprivate OAuth3ClientContext context;@Override    public void apply(RequestTemplate template) {        if(context.getAccessToken() != null && context.getAccessToken().getValue() != null && OAuth3AccessToken.BEARER_TYPE.equalsIgnoreCase(context.getAccessToken().getTokenType()) ){            template.header("Authorization", String.format("%s %s", OAuth3AccessToken.BEARER_TYPE, context.getAccessToken().getValue()));        }    }

spring cloud微服务增加oauth3权限后 feign调用报null

在授权服务里,用户通过用户名密码,或者手机和验证码等方式登陆之后,在http头里会有授权的标识,在客户端调用时,需要添加当时有效的token才可以正常访问被授权的页面。

Content-Type:application/JSONAuthorization:Bearer d79c064c-8675-4047-a119-fac692e447e8

而在业务层里,服务与服务之间使用feign来实现调用,而授权的代码我们可以通过拦截器实现,在feign请求之前,把当前服务的token添加到目标服务的请求头就可以了

一般是这样实现的

@Componentpublic class TokenFeignClientInterceptor implements RequestInterceptor {    @Override  public void apply(RequestTemplate requestTemplate) {    RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();    if (requestAttributes != null) {      httpservletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();      requestTemplate.header("Authorization", request.getHeader("Authorization"));    }  }}

上面的拦截器代码没有什么问题,也很好理解,但事实上,当你的feign开启了hystrix功能,如果开启了,需要把hystrix的策略进行修改,默认是THREAD的,这个级别时ThreadLocal是空的,所以你的授权不能传给feign的拦截器.

hystrix:     command:         default:             execution:                 isolation:                     strategy: SEMAPHORE

到此,相信大家对“spring cloud oauth2 feign遇到的坑怎么解决”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: spring cloud oauth2 feign遇到的坑怎么解决

本文链接: https://www.lsjlt.com/news/324187.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • spring cloud oauth2 feign遇到的坑怎么解决
    本篇内容主要讲解“spring cloud oauth2 feign遇到的坑怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spring cloud...
    99+
    2023-06-29
  • spring cloud Feign使用@RequestLine遇到的坑
    Feign使用@RequestLine遇到的坑 如何在微服务项目中调用其它项目的接口试使用spring cloud feign声明式调用。 @FeignClient(name=...
    99+
    2022-11-12
  • Feign+mybatisplus搭建项目遇到的坑如何解决
    这篇文章主要讲解了“Feign+mybatisplus搭建项目遇到的坑如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Feign+mybatisplus搭建项目遇到的坑如何解决”吧!出...
    99+
    2023-07-05
  • 解决Spring boot 整合Junit遇到的坑
    目录这是我在使用springboot整合Junit的时候遇到的坑1.在pom.xml中添加junit环境的依赖2.在src/test/java下建立测试类3.自己编写的启动类Spri...
    99+
    2022-11-12
  • spring/springboot整合curator遇到的坑及解决
    目录整个代码可项目遇到了两个问题解决办法近期本人在搭建自己的调度平台项目使用到了zookeeper做执行器自动注册中心时,使用到了springboot2.0+curator4.0版本...
    99+
    2022-11-13
  • MyBatis+MyBatisPlus中遇到的坑怎么解决
    这篇文章主要介绍了MyBatis+MyBatisPlus中遇到的坑怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MyBatis+MyBatisPlus中遇到的坑怎么解决文章都会有所收获,下面我们一起来看...
    99+
    2023-07-05
  • SpringBoot整合RocketMQ遇到的坑怎么解决
    本篇内容主要讲解“SpringBoot整合RocketMQ遇到的坑怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot整合RocketMQ遇到的坑怎么解决”吧!应用场景在实...
    99+
    2023-06-08
  • SpringCloud feign对象传参和普通传参及遇到的坑如何解决
    这篇文章主要介绍“SpringCloud feign对象传参和普通传参及遇到的坑如何解决”,在日常操作中,相信很多人在SpringCloud feign对象传参和普通传参及遇到的坑如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的...
    99+
    2023-06-29
  • SpringCloud项目中Feign组件添加请求头所遇到的坑及解决
    目录前言分析解决原因找到了总结前言 在spring cloud的项目中用到了feign组件,简单配置过后即可完成请求的调用。 又因为有向请求添加Header头的需求,查阅了官方示例后...
    99+
    2023-05-18
    SpringCloud中Feign组件 Feign组件添加请求头 Feign添加请求头
  • spring jpa设置多个主键遇到的小坑及解决
    目录jpa设置多个主键遇到的坑解决办法jpa遇到多主键表如何进行查询1、使用 List<Map<String, Object>>的方式去接收2、自定义接收类3...
    99+
    2022-11-13
  • 使用vue导出excel遇到的坑怎么解决
    这篇“使用vue导出excel遇到的坑怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“使用vue导出excel遇到的坑...
    99+
    2023-06-29
  • vue-cli项目中遇到的eslint坑怎么解决
    今天小编给大家分享一下vue-cli项目中遇到的eslint坑怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。vue-...
    99+
    2023-06-30
  • 使用Vant框架list组件遇到的坑怎么解决
    本篇内容介绍了“使用Vant框架list组件遇到的坑怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用Vant框架list组件的坑介...
    99+
    2023-06-30
  • VUE3+TS获取组件类型遇到的坑怎么解决
    VUE3+TS获取组件类型的方法踩坑获取组件类型的方法const AccountRef = ref<InstanceType<typeof LoginAccount>>()遇到的坑typeof LoginAccoun...
    99+
    2023-05-14
    Vue3 ts
  • 使用this.getClass().getResource()获取文件时遇到的坑怎么解决
    这篇文章主要介绍“使用this.getClass().getResource()获取文件时遇到的坑怎么解决”,在日常操作中,相信很多人在使用this.getClass().getResource()获取文件时遇到的坑怎么解决问题上存在疑惑,...
    99+
    2023-07-04
  • react项目引入antd框架方式及遇到的坑怎么解决
    这篇文章主要介绍了react项目引入antd框架方式及遇到的坑怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇react项目引入antd框架方式及遇到的坑怎么解决文章都会有所收获,下面我们一起来看看吧。r...
    99+
    2023-07-05
  • 使用Mybatis遇到的坑之Integer类型参数问题怎么解决
    这篇文章主要讲解了“使用Mybatis遇到的坑之Integer类型参数问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“使用Mybatis遇到的坑之Integer类型参数问题怎么解决...
    99+
    2023-07-05
  • vue3+echart5遇到的坑Cannot read properties of undefined (reading 'type')怎么解决
    本文小编为大家详细介绍“vue3+echart5遇到的坑Cannot read properties of undefined (reading 'type')怎么...
    99+
    2023-07-06
  • 引入spring-cloud-starter-openfeign后部分类找不到怎么解决
    今天小编给大家分享一下引入spring-cloud-starter-openfeign后部分类找不到怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收...
    99+
    2023-06-29
  • SpringCloud中Feign组件添加请求头的坑怎么解决
    这篇文章主要介绍“SpringCloud中Feign组件添加请求头的坑怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringCloud中Feign组件添加请求头的坑怎么解决”文章能帮助大...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作