1. system 提供 OAuth2TokenApi 接口

2. gateway 通过 feign 引入 OAuth2TokenApi 接口
This commit is contained in:
YunaiV
2022-06-03 01:11:13 +08:00
parent 94d62b8d79
commit e89ef5496c
7 changed files with 121 additions and 3 deletions

View File

@@ -16,6 +16,13 @@
<url>https://github.com/YunaiV/yudao-cloud</url>
<dependencies>
<!-- 业务组件 -->
<dependency>
<groupId>cn.iocoder.cloud</groupId>
<artifactId>yudao-module-system-api</artifactId>
<version>${revision}</version>
</dependency>
<!-- Gateway 网关相关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
@@ -28,6 +35,11 @@
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- Registry 注册中心相关 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>

View File

@@ -1,9 +1,14 @@
package cn.iocoder.yudao.gateway;
import cn.iocoder.yudao.module.system.api.auth.OAuth2TokenApi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients(clients = {
OAuth2TokenApi.class
}) // TODO 芋艿:需要改下
public class GatewayServerApplication {
public static void main(String[] args) {

View File

@@ -0,0 +1,45 @@
package cn.iocoder.yudao.gateway.filter;
import cn.iocoder.yudao.module.system.api.auth.OAuth2TokenApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import java.util.function.Consumer;
/**
* Token 过滤器,验证 token 的有效性
* 1. 验证通过时,将 userId、userType、tenantId 通过 Header 转发给服务
* 2. 验证不通过,还是会转发给服务。因为,接口是否需要登录的校验,还是交给服务自身处理
*
* @author 芋道源码
*/
@Component // TODO 芋艿:要改成 configuration
public class TokenAuthenticationFilter implements GlobalFilter, Ordered {
@Resource
private OAuth2TokenApi oauth2TokenApi;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
exchange = exchange.mutate().request(r -> r.headers(new Consumer<HttpHeaders>() {
@Override
public void accept(HttpHeaders headers) {
headers.set("user-id", "1");
}
})).build();
return chain.filter(exchange);
}
@Override
public int getOrder() {
return -100; // 和 Spring Security Filter 的顺序对齐
}
}

View File

@@ -0,0 +1,39 @@
package cn.iocoder.yudao.gateway.util;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
/**
* 安全服务工具类
*
* copy from yudao-spring-boot-starter-security 的 SecurityFrameworkUtils 类
*
* @author 芋道源码
*/
public class SecurityFrameworkUtils {
public static final String AUTHORIZATION_HEADER = "Authorization";
public static final String AUTHORIZATION_BEARER = "Bearer";
private SecurityFrameworkUtils() {}
/**
* 从请求中,获得认证 Token
*
* @param exchange 请求
* @return 认证 Token
*/
public static String obtainAuthorization(ServerWebExchange exchange) {
String authorization = exchange.getRequest().getHeaders().getFirst(AUTHORIZATION_HEADER);
if (!StringUtils.hasText(authorization)) {
return null;
}
int index = authorization.indexOf(AUTHORIZATION_BEARER + " ");
if (index == -1) { // 未找到
return null;
}
return authorization.substring(index + 7).trim();
}
}