feign默认不携带token问题&使用 jwt 作为 token

本文介绍了解决Feign默认不携带token的问题,包括在应用配置中设置Hystrix隔离模式,创建RequestInterceptor,以及在授权服务中使用JWT进行用户验证。详细步骤涉及导入相关依赖,创建配置类,实现TokenEnhancer接口以添加自定义内容,并在客户端从JWT中读取这些信息。
摘要由CSDN通过智能技术生成

feign 默认不携带 token,需要进行配置:

  1. 编辑 application 设置 hystrix 的隔离模式(编辑每一个需要token处理业务逻辑的服务的dev,添加如下内容)
hystrix:
  command:
    default:
      execution:
        isolation:
          strategy: SEMAPHORE   #设置hysitrix的隔离级别为信号量,只有这个级别才可以拿到客户端发送的token,默认级别是THREAD
  1. 在当前的每一个服务中创建配置类 MyRequestInterceptor 实现 RequestInterceptor 接口
package com.zhiyou100.config;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails;

/**feign使用的时候通过Service获取别的服务器中的数据,出现token丢失的问题,
 * 为了解决这个问题,我们创建这个配置类,并且在dev中添加配置
 * @author zhangfan
 * @date 2019/10/21
 */
@Configuration
public class MyRequestInterceptor implements RequestInterceptor {
   
    @Override
    public void apply(RequestTemplate requestTemplate) {
   

        //获取    客户端的授权信息
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

        //只有客户端传递token的时候才去添加
        if (authentication != null){
   

            //获取token详细信息
            Object details = authentication.getDetails();

            if (details instanceof OAuth2AuthenticationDetails){
   

                OAuth2AuthenticationDetails details1 = (OAuth2AuthenticationDetails) details;

                //获取token
                String token = details1.getTokenValue();

                //在feign的请求头中添加token
                requestTemplate.header("Authorization","bearer" + token);

            }

        }
    }
}

修改 auth 服务,从数据库读取和验证用户信息:

1. 制作数据库
    需要 3 张表:用户表,角色表和用户角色表(关系表)
DROP DATABASE IF EXISTS `spring_cloud_01`;
CREATE DATABASE `spring_cloud_01`;

USE `spring_cloud_01`;

CREATE TABLE IF NOT EXISTS `user` (
    `id` INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
    `account` VARCHAR(20) NOT NULL COMMENT '账号',
    `password` VARCHAR(100) NOT NULL COMMENT '密码'
) COMMENT '用户表';

INSERT INTO user VALUES(NULL, 'zhangsan', '{bcrypt}$2a$10$YQjMpUJ116gDNBVKntYnJewx4/mdhLar38VBYR/5DX7mYTXw/cPcm');
INSERT INTO user VALUES(NULL, 'lisi', '{bcrypt}$2a$10$YQjMpUJ116gDNBVKntYnJewx4/mdhLar38VBYR/5DX7mYTXw/cPcm');

CREATE TABLE IF NOT EXISTS `role` (
    `id` INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
    `name` VARCHAR(20) NOT NULL COMMENT '名称'
) COMMENT '角色表';

INSERT INTO role VALUES(NULL, 'ADMIN');
INSERT INTO role VALUES(NULL, 'EMPLOYEE');

CREATE TABLE IF NOT EXISTS `user_role` (
    `id` INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
    `user_id` INT NOT NULL COMMENT '用户主键',
    `role_id` INT NOT NULL COMMENT '角色主键'   
) COMMENT '用户角色表';   

INSERT INTO user_role VALUES(NULL, 1, 1);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值