FeignClient 在 oauth2 中与 hystrix 线程策略冲突问题造成的权限问题

2023-11-19

FeignClient 在 oauth2 中与 hystrix 线程策略冲突问题造成的权限问题


问题描述

在springcloud 系统中,通过feignclient 传递oauth2 token的时候,出现 no full authentication 问题

问题原因

hystrix 默认的线程策略是thread。也就是说在 hystrix启用状态下,当执行feignclient 调用的时候,会另起一个线程,导致安全上下问题传递不到子线程中。

问题解决方法

方法1 直接禁用 hystrix

通过在配置文件application.yaml 中加入如下内容,关闭feign 中的hystrix,但是现实场景最好不关闭。

feign:
  hystrix:
    enabled: false

方法2 设置hystrix 线程策略

通过在配置文件application.yaml 中加入如下内容,设置hystrix的线程策略

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 60000
          #这里将线程策略设置为SEMAPHORE
          strategy: SEMAPHORE

最后的工作 OAuth2FeignRequestInterceptor

添加 OAuth2FeignRequestInterceptor 自定义类

/**
 *  author chen roger
 */
package com.springcloud.template.common.security.jwt.Interceptor;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.security.oauth2.client.feign.OAuth2FeignRequestInterceptor;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.security.oauth2.client.OAuth2ClientContext;
import org.springframework.security.oauth2.client.token.AccessTokenProvider;
import org.springframework.security.oauth2.client.token.AccessTokenProviderChain;
import org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsAccessTokenProvider;
import org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeAccessTokenProvider;
import org.springframework.security.oauth2.client.token.grant.implicit.ImplicitAccessTokenProvider;
import org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordAccessTokenProvider;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@Slf4j
public class MyOAuth2FeignRequestInterceptor extends OAuth2FeignRequestInterceptor {



    private final OAuth2ClientContext oAuth2ClientContext;


    private final AccessTokenProvider accessTokenProvider;

    public MyOAuth2FeignRequestInterceptor(OAuth2ClientContext oAuth2ClientContext) {
        super(oAuth2ClientContext, null);
        HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        this.oAuth2ClientContext=oAuth2ClientContext;
        List<AccessTokenProvider> chain = new ArrayList<>();

        AuthorizationCodeAccessTokenProvider authorizationCodeAccessTokenProvider= new AuthorizationCodeAccessTokenProvider();
        authorizationCodeAccessTokenProvider.setRequestFactory(httpComponentsClientHttpRequestFactory);
        chain.add(authorizationCodeAccessTokenProvider);

        ImplicitAccessTokenProvider implicitAccessTokenProvider = new ImplicitAccessTokenProvider();
        implicitAccessTokenProvider.setRequestFactory(httpComponentsClientHttpRequestFactory);
        chain.add(implicitAccessTokenProvider);

        ResourceOwnerPasswordAccessTokenProvider resourceOwnerPasswordAccessTokenProvider = new ResourceOwnerPasswordAccessTokenProvider();
        resourceOwnerPasswordAccessTokenProvider.setRequestFactory(httpComponentsClientHttpRequestFactory);
        chain.add(resourceOwnerPasswordAccessTokenProvider);

        ClientCredentialsAccessTokenProvider clientCredentialsAccessTokenProvider = new ClientCredentialsAccessTokenProvider();
        clientCredentialsAccessTokenProvider.setRequestFactory(httpComponentsClientHttpRequestFactory);
        chain.add(clientCredentialsAccessTokenProvider);
        List<AccessTokenProvider> providers=Collections.unmodifiableList(chain);
        accessTokenProvider=new AccessTokenProviderChain(providers);



    }


}

注册自定义的 OAuth2FeignRequestInterceptor

/**
 *  author chen roger
 */

package com.springcloud.template.common.security.jwt;

import com.springcloud.template.common.security.jwt.Interceptor.MyOAuth2FeignRequestInterceptor;
import feign.RequestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.oauth2.client.OAuth2ClientContext;

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class GlobalMethodSecurityConfiguration {

    @Bean
    public RequestInterceptor oAuth2FeignRequestInterceptor(OAuth2ClientContext oAuth2ClientContext){
        return new MyOAuth2FeignRequestInterceptor(oAuth2ClientContext);
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FeignClient 在 oauth2 中与 hystrix 线程策略冲突问题造成的权限问题 的相关文章

随机推荐

  • 《机器人操作系统入门》课程代码示例安装出错解决方法

    问题描述 学习 机器人操作系统入门 课程时 在Ubuntu 16 04 上安装了kinetic 安装ROS Academy for Beginners时依赖总是报错 如下所示 rosdep install from paths src ig
  • endnote插入的不是序号(而是大括号加上作者)的解决

    仅作为记录 大佬请跳过 之前用word通过endnote导入文献 都是可以的 在正文出现 1 的引用 但是博主新的word 需要修改参考文献 因此拟重新导入参考文献来修改 但发现导入的都是 Dou 2017 在正文中 文章目录 解决 参考
  • 50多个开源PDF阅读编辑工具汇总

    PDF Editing Creation 50 open source free alternatives to Adobe Acrobat 文章来源于这里 版权归原作者所有 Adobe Acrobat is expensive but t
  • QT QTableWidget 表格 学习笔记

    首先 了解一下QTableWidget 控件的属性 成员方法 功能 setText const QString text 设置单元格中的文本 setlcon const Qlcon icon 给单元格添加图标 setBackground c
  • unity3d 输入法相关API

    Input inputString 获取输入的文字 正在打的中文是接受不到的 只有在文字写到文本框才能获取 Input imeCompositionMode 是否是激活输入框状态 on 是 Input compositionString 空
  • 软件测试之登录测试详解

    一 功能测试 登录 功能性测试用例包括 1 什么都不输入 点击提交按钮 看提示信息 非空检查 2 输入已注册的用户名和正确的密码 验证是否登录成功 3 输入已注册的用户名和不正确的密码 验证是否登录失败 并且提示信息正确 4 输入未注册的用
  • mysql将执行过的sql放到历史记录里面

    查看是不是开启将历史执行的sql存入文件 show variables like general log 输出结果如下 gt Variable name Value
  • Anaconda安装教程

    文章目录 1 下载链接 2 安装步骤 3 确认已安装Anaconda 4 问题解决 4 1问题一 4 2问题二 1 下载链接 Anaconda百度网盘链接 点击即可进入百度网盘 提取码u5fx 建议不要去官网下载最新版本的 因为后期可能会遇
  • H264视频传输、编解码----RTSP认证

    Rtsp认证主要分为两种 基本认证 basic authentication 和摘要认证 digest authentication 基本认证是http 1 0提出的认证方案 其消息传输不经过加密转换因此存在严重的安全隐患 摘要认证是htt
  • 智能门禁(2)---安检人脸识别人证验证系统解决方案

    安检人脸识别人证验证系统解决方案方案 一 概述及特点 基于可见光下的中远距离人脸识别算法 人脸识别智能监控平台 对多个摄像头监控范围内的多个人脸同时进行检测 跟踪和识别 实时对人员身份进行确认 一旦发现黑名单人员 自动报警 实现24小时的非
  • Python沙雕故事生成器

    Python故事生成器 本文章小编来给大家分享使用Python制作一个故事生成器 仅供娱乐 一 知识归纳 StringVar 控件变量 python中在使用界面编程时 用于跟踪数值不断发生变化的变量 确保数值的变更可以随时在根窗口上面显示出
  • YOLO3 -- 介绍

    YOLO介绍 YOLO官网 YOLO You Only Look Once 是目标检测模型 目标检测是计算机视觉中比较简单的任务 用来在一张图片中找到某些特定的物体 目标检测不仅要求我们识别这些物体的种类 同时要求我们标出这些物体的位置 Y
  • 【深度学习系列】用Tensorflow进行图像分类

    上个月发布了四篇文章 主要讲了深度学习中的 hello world mnist图像识别 以及卷积神经网络的原理详解 包括基本原理 自己手写CNN和paddlepaddle的源码解析 这篇主要跟大家讲讲如何用PaddlePaddle和Tens
  • eaxyx界面学习

    1 easyX的原理 基于Windows图形编程 将Windows下的复杂程序过程进行封装 仅给用户提供一个简单熟悉的接口 用户对于图形库中函数的调用 最终都会由Windows底层的API实现 在官网搜索eaxyx下载点击安装即可 接着引用
  • 恒合仓库 - 商品管理模块、上传照片、添加采购单、添加出库单、商品分类

    商品管理模块 文章目录 商品管理模块 一 分页查询商品 1 1 实体类 1 1 1 Store 仓库 1 1 2 Brand 品牌 1 1 3 ProductType 商品分类 1 1 4 Supply 供应商 1 1 5 Place 产地
  • Linux网络连接出现问题

    报错截图 1 先查看NetworkManager是否启动 查看NetworkManager是否启动 systemctl status NetworkManager 在Linux系统中 可以通过以下命令启动NetworkManager服务 s
  • 小程序项目时间选择器用法

    项目需求是要实现这种形式 但是相信大家都试了各种插件 都不太合适 uView框架也不能满足自己的需要 推荐使用 uview ui plus 基本上小程序遇到的单选多选 日期 省市区 都可以完美的实现 可以通过插件市场安装使用 但是要实现ui
  • matplotlib画动态三维图

    从txt文本中读取数据并画动态三维点图 程序中实现动态三维图绘制 添加图标题 坐标轴标题 坐标轴数值范围 两种绘图模式 一种动态画图 所有点均保留 另一种每次仅显示一个点 三维坐标轴设置区间 需要通过Axes3D创建ax 否则其他方式无法设
  • Openface的安装和使用

    openface的安装与使用 环境 我的电脑是笔记本电脑 win10系统 用的是pycharm和annaconda 一 首先下载openface安装包 并且安装 1 下载地址 https codeload github com cmusat
  • FeignClient 在 oauth2 中与 hystrix 线程策略冲突问题造成的权限问题

    FeignClient 在 oauth2 中与 hystrix 线程策略冲突问题造成的权限问题 FeignClient 在 oauth2 中与 hystrix 线程策略冲突问题造成的权限问题 问题描述 问题原因 问题解决方法 方法1 直接禁