请自行将自定义签名类放置在客户端应用JVM的classpath路径内。
根据您的需求,选择如下一种方式(如果三种方式同时配置,则优先顺序为 3->2->1):
- classpath下的
META-INF/services/com.alibaba.csb.security.spi.SignService
文件里指定签名实现类(配置方式参见 Java标准的serviceLoader说明)。所有CSB请求都将使用此签名类。 - JVM参数
-Dcom.alibaba.csb.security.spi.SignService=your-impl-class
指定签名实现类。所有CSB请求都将使用此签名类。 - 特定CSB服务请求时,增加参数
HttpParameter.Builder.signImpl("your-sign-impl-class")
指定签名实现类。此方式下,不同CSB请求可以指定不同的签名类。客户端示意代码:
builder.requestURL("http://localhost:8086/CSB").api("PING").version("vcsb").method("get") .accessKey("ak").secretKey("sk")
.signImpl("your-sign-impl-class"); //指定客户端签名类
...
HttpCaller.doPost(builder.build()) or doGet(builder.build()) or invoke(builder.build());
- 实现接口
com.alibaba.csb.security.spi.SignService
里的generateSignature()
方法。 - 提供公共的无参构造方法,且实现类必须是线程安全的。
- 使用前必须请与CSB-Broker协商,确认支持此种方式的验签。
public class SampleSignImpl implements SignService {
/**
* 客户端请求参数进行签名处理
* @param paramNodeList 已排序的待签名请求参数key=values键值对列表
* @param accessKey 进行签名的凭证识别码
* @param secretKey 进行签名的安全码
* @return 客户端签名串
*/
public String generateSignature(SortedParamList paramNodeList, final String accessKey, final String secretKey) {
String reqStr = paramNodeList.toString();
System.out.println("SampleSignImpl签名,请求参数列表串:" + reqStr);
return reqStr.substring(0, 10); //模拟签名算法
}
}
- 请自行将自定义验签类jar放置在CSB Broker的docker容器内的
/home/admin/cloud-gateway/patchlib
路径下。 - 设置admin用户对patchlib目录下jar文件有读取权限。
- 重启CSB Broker的docker容器。
根据您的需求,选择客户端或服务端指定验签类的一种。如果客户端和服务端同时指定,则客户端指定优先。
在自定义验签类jar内根目录的 META-INF/services/com.alibaba.csb.security.spi.VerifySignService
文件里指定验签实现类。所有CSB请求都将使用此验签类。
CSB客户端发送请求时,通过附带HTTP头(_api_verify_sign_impl=your-verify-sign-impl-class
)给CSB服务端,服务端在patchlib目录下的jar中加载此特定验签类,并对请求进行验签。
可以使用如下任意一种指定方式(如果2种方式同时配置,则方式2优先):
- 客户端JVM参数
-Dcom.alibaba.csb.security.spi.VerifySignService=your-verify-sign-impl-class
指定验签实现类。所有当前客户端发出的CSB请求都将指定为使用此验签类。 - 特定CSB服务请求时,客户端增加参数
HttpParameter.Builder.verifySignImpl("your-verify-sign-impl-class")
,CSB服务端会使用指定的验签类对当前请求进行验签。此方式优先于第1种方式。客户端示意代码:
builder.requestURL("http://localhost:8086/CSB").api("PING").version("vcsb").method("get") .accessKey("ak").secretKey("sk")
.verifySignImpl("your-verify-sign-impl-class"); //指定服务端验签类
...
HttpCaller.doPost(builder.build()) or doGet(builder.build()) or invoke(builder.build());
- 实现接口
com.alibaba.csb.security.spi.VerifySignService
里的verifySignature()
方法。 - 提供公共的无参构造方法,且实现类必须是线程安全的。
public class SampleVerifySignImpl implements VerifySignService {
/**
* 对客户端请求参数进行验签处理
*
* @param paramNodeList 所有请求参数key=values键值对列表,不包含签名 _api_signature 的键值对。
* @param accessKey 进行签名的凭证识别码
* @param signature 客户端签名串
* @return 验签是否成功
*/
@Override
public boolean verifySignature(SortedParamList paramNodeList, String accessKey, String signature) {
String reqStr = paramNodeList.toString();
log.info("SampleVerifySignImpl验签,参数列表:" + reqStr);
return signature.equals(reqStr.substring(0, 10)); //模拟验签算法
}
}