feign 默认不携带 token,需要进行配置:
- 编辑 application 设置 hystrix 的隔离模式(编辑每一个需要token处理业务逻辑的服务的dev,添加如下内容)
hystrix:
command:
default:
execution:
isolation:
strategy: SEMAPHORE #设置hysitrix的隔离级别为信号量,只有这个级别才可以拿到客户端发送的token,默认级别是THREAD
- 在当前的每一个服务中创建配置类 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);