feat: 1.0.3版本升级,增加鉴权管理
This commit is contained in:
parent
fc8a6293e8
commit
871cf00c0b
4
pom.xml
4
pom.xml
@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
<groupId>group.flyfish</groupId>
|
<groupId>group.flyfish</groupId>
|
||||||
<artifactId>rest-proxy</artifactId>
|
<artifactId>rest-proxy</artifactId>
|
||||||
<version>1.0.2</version>
|
<version>1.0.3</version>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<maven.compiler.source>8</maven.compiler.source>
|
<maven.compiler.source>8</maven.compiler.source>
|
||||||
@ -22,7 +22,7 @@
|
|||||||
<java.version>1.8</java.version>
|
<java.version>1.8</java.version>
|
||||||
<commons-collection.version>4.4</commons-collection.version>
|
<commons-collection.version>4.4</commons-collection.version>
|
||||||
<commons.lang.version>2.6</commons.lang.version>
|
<commons.lang.version>2.6</commons.lang.version>
|
||||||
<sdk.version>1.0.2</sdk.version>
|
<sdk.version>1.0.3</sdk.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>group.flyfish</groupId>
|
<groupId>group.flyfish</groupId>
|
||||||
<artifactId>rest-proxy</artifactId>
|
<artifactId>rest-proxy</artifactId>
|
||||||
<version>1.0.2</version>
|
<version>1.0.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
@ -32,4 +32,11 @@ public @interface RestService {
|
|||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
int timeout() default -1;
|
int timeout() default -1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 鉴权提供者类
|
||||||
|
*
|
||||||
|
* @return 具体实现了RestAuthProvider的类
|
||||||
|
*/
|
||||||
|
Class<?> authProvider() default Object.class;
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>group.flyfish</groupId>
|
<groupId>group.flyfish</groupId>
|
||||||
<artifactId>rest-proxy</artifactId>
|
<artifactId>rest-proxy</artifactId>
|
||||||
<version>1.0.2</version>
|
<version>1.0.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
package group.flyfish.rest.configuration;
|
package group.flyfish.rest.configuration;
|
||||||
|
|
||||||
|
import group.flyfish.rest.core.auth.RestAuthProvider;
|
||||||
import group.flyfish.rest.core.factory.PropertiesConfigurator;
|
import group.flyfish.rest.core.factory.PropertiesConfigurator;
|
||||||
import group.flyfish.rest.utils.DataUtils;
|
import group.flyfish.rest.utils.DataUtils;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.InitializingBean;
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@ -40,6 +42,11 @@ public class RestClientProperties implements InitializingBean {
|
|||||||
*/
|
*/
|
||||||
private Map<String, String> urls = new HashMap<>();
|
private Map<String, String> urls = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 默认的认证提供者
|
||||||
|
*/
|
||||||
|
private RestAuthProvider authProvider;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取字典url
|
* 获取字典url
|
||||||
*
|
*
|
||||||
@ -53,6 +60,11 @@ public class RestClientProperties implements InitializingBean {
|
|||||||
return urls.get(key);
|
return urls.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Autowired(required = false)
|
||||||
|
public void setDefaultAuthProvider(RestAuthProvider provider) {
|
||||||
|
this.authProvider = provider;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void afterPropertiesSet() {
|
public void afterPropertiesSet() {
|
||||||
PropertiesConfigurator.shared().configure(this);
|
PropertiesConfigurator.shared().configure(this);
|
||||||
|
@ -0,0 +1,18 @@
|
|||||||
|
package group.flyfish.rest.core.auth;
|
||||||
|
|
||||||
|
import group.flyfish.rest.core.client.RestClientBuilder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* rest认证提供者
|
||||||
|
*
|
||||||
|
* @author wangyu
|
||||||
|
*/
|
||||||
|
public interface RestAuthProvider {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过入侵client提供鉴权
|
||||||
|
*
|
||||||
|
* @param builder rest客户端构建器
|
||||||
|
*/
|
||||||
|
void provide(RestClientBuilder builder);
|
||||||
|
}
|
@ -5,6 +5,7 @@ import group.flyfish.rest.annotation.AutoMapping;
|
|||||||
import group.flyfish.rest.annotation.RestApi;
|
import group.flyfish.rest.annotation.RestApi;
|
||||||
import group.flyfish.rest.annotation.RestService;
|
import group.flyfish.rest.annotation.RestService;
|
||||||
import group.flyfish.rest.configuration.RestClientProperties;
|
import group.flyfish.rest.configuration.RestClientProperties;
|
||||||
|
import group.flyfish.rest.core.auth.RestAuthProvider;
|
||||||
import group.flyfish.rest.core.client.RestClient;
|
import group.flyfish.rest.core.client.RestClient;
|
||||||
import group.flyfish.rest.core.client.RestClientBuilder;
|
import group.flyfish.rest.core.client.RestClientBuilder;
|
||||||
import group.flyfish.rest.core.factory.PropertiesConfigurable;
|
import group.flyfish.rest.core.factory.PropertiesConfigurable;
|
||||||
@ -17,6 +18,7 @@ import group.flyfish.rest.registry.proxy.support.UrlCompiler;
|
|||||||
import group.flyfish.rest.registry.wrapper.DefaultRestResultMapping;
|
import group.flyfish.rest.registry.wrapper.DefaultRestResultMapping;
|
||||||
import group.flyfish.rest.utils.DataUtils;
|
import group.flyfish.rest.utils.DataUtils;
|
||||||
import group.flyfish.rest.utils.JacksonUtil;
|
import group.flyfish.rest.utils.JacksonUtil;
|
||||||
|
import lombok.SneakyThrows;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.http.client.config.RequestConfig;
|
import org.apache.http.client.config.RequestConfig;
|
||||||
import org.springframework.aop.support.AopUtils;
|
import org.springframework.aop.support.AopUtils;
|
||||||
@ -32,7 +34,6 @@ import java.lang.reflect.Proxy;
|
|||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Consumer;
|
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -57,6 +58,8 @@ public class RestProxyInvoker<T> implements InvocationHandler, PropertiesConfigu
|
|||||||
private final RestApiRegistry registry;
|
private final RestApiRegistry registry;
|
||||||
// 结果映射
|
// 结果映射
|
||||||
private RestResultMapping mapping;
|
private RestResultMapping mapping;
|
||||||
|
// 鉴权提供者
|
||||||
|
private RestAuthProvider authProvider;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构造器
|
* 构造器
|
||||||
@ -93,11 +96,9 @@ public class RestProxyInvoker<T> implements InvocationHandler, PropertiesConfigu
|
|||||||
@Override
|
@Override
|
||||||
public void configure(RestClientProperties properties) {
|
public void configure(RestClientProperties properties) {
|
||||||
this.properties = properties;
|
this.properties = properties;
|
||||||
this.config = RequestConfig.custom()
|
this.config = RequestConfig.custom().setConnectTimeout((int) properties.getConnectionTimeout().toMillis()).setSocketTimeout(restService.timeout()).build();
|
||||||
.setConnectTimeout((int) properties.getConnectionTimeout().toMillis())
|
|
||||||
.setSocketTimeout(restService.timeout())
|
|
||||||
.build();
|
|
||||||
this.baseUrl = this.findBaseUrl();
|
this.baseUrl = this.findBaseUrl();
|
||||||
|
this.authProvider = determineAuthProvider();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -129,10 +130,7 @@ public class RestProxyInvoker<T> implements InvocationHandler, PropertiesConfigu
|
|||||||
// 第一步就解析参数
|
// 第一步就解析参数
|
||||||
ArgumentResolveContext context = composite.resolve(restApi, method, args);
|
ArgumentResolveContext context = composite.resolve(restApi, method, args);
|
||||||
// 构造和调用,这里的restClient不保存状态
|
// 构造和调用,这里的restClient不保存状态
|
||||||
RestClientBuilder builder = RestClient.create()
|
RestClientBuilder builder = RestClient.create().url(determineUrl(restApi, context)).method(restApi.method()).config(config);
|
||||||
.url(determineUrl(restApi, context))
|
|
||||||
.method(restApi.method())
|
|
||||||
.config(config);
|
|
||||||
// 需要带cookie的带上
|
// 需要带cookie的带上
|
||||||
if (restApi.credentials()) {
|
if (restApi.credentials()) {
|
||||||
builder.withCredential();
|
builder.withCredential();
|
||||||
@ -149,7 +147,11 @@ public class RestProxyInvoker<T> implements InvocationHandler, PropertiesConfigu
|
|||||||
if (context.hasHeaders()) {
|
if (context.hasHeaders()) {
|
||||||
builder.headers(context.getHeaders());
|
builder.headers(context.getHeaders());
|
||||||
}
|
}
|
||||||
// 赋值头部
|
// 添加鉴权信息
|
||||||
|
if (null != authProvider) {
|
||||||
|
authProvider.provide(builder);
|
||||||
|
}
|
||||||
|
// 构建客户端
|
||||||
RestClient client = builder.build();
|
RestClient client = builder.build();
|
||||||
// 设置客户端
|
// 设置客户端
|
||||||
client.setClient(registry.getProvider());
|
client.setClient(registry.getProvider());
|
||||||
@ -235,10 +237,7 @@ public class RestProxyInvoker<T> implements InvocationHandler, PropertiesConfigu
|
|||||||
url = restApi.url();
|
url = restApi.url();
|
||||||
} else {
|
} else {
|
||||||
// 构建基础url,优先级从小到大依次找。同时尝试取字典值
|
// 构建基础url,优先级从小到大依次找。同时尝试取字典值
|
||||||
Optional<String> baseUrl = Stream.of(restApi.baseUrl(), this.baseUrl)
|
Optional<String> baseUrl = Stream.of(restApi.baseUrl(), this.baseUrl).filter(DataUtils::isNotBlank).findFirst().map(found -> found.startsWith("#") ? properties.getDictUrl(found.substring(1)) : found);
|
||||||
.filter(DataUtils::isNotBlank)
|
|
||||||
.findFirst()
|
|
||||||
.map(found -> found.startsWith("#") ? properties.getDictUrl(found.substring(1)) : found);
|
|
||||||
// 判定和赋值
|
// 判定和赋值
|
||||||
if (baseUrl.isPresent() && DataUtils.isNotBlank(restApi.uri())) {
|
if (baseUrl.isPresent() && DataUtils.isNotBlank(restApi.uri())) {
|
||||||
url = baseUrl.get() + restApi.uri();
|
url = baseUrl.get() + restApi.uri();
|
||||||
@ -249,4 +248,18 @@ public class RestProxyInvoker<T> implements InvocationHandler, PropertiesConfigu
|
|||||||
// 尝试解析路径参数
|
// 尝试解析路径参数
|
||||||
return context.hasPathParams() ? UrlCompiler.compile(url, context.getPathParams()) : url;
|
return context.hasPathParams() ? UrlCompiler.compile(url, context.getPathParams()) : url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确定鉴权提供者
|
||||||
|
*
|
||||||
|
* @return 实例化的提供者
|
||||||
|
*/
|
||||||
|
@SneakyThrows
|
||||||
|
private RestAuthProvider determineAuthProvider() {
|
||||||
|
Class<?> candidate = restService.authProvider();
|
||||||
|
if (ClassUtils.isAssignable(RestAuthProvider.class, candidate)) {
|
||||||
|
return (RestAuthProvider) candidate.newInstance();
|
||||||
|
}
|
||||||
|
return properties.getAuthProvider();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user