Skip to content

Latest commit

 

History

History
90 lines (78 loc) · 4.96 KB

r20181031.md

File metadata and controls

90 lines (78 loc) · 4.96 KB

Release @ 20181031

支持SPI方式指定客户端签名实现类

自定义签名类部署

请自行将自定义签名类放置在客户端应用JVM的classpath路径内。

自定义签名类指定方式

根据您的需求,选择如下一种方式(如果三种方式同时配置,则优先顺序为 3->2->1):

  1. classpath下的 META-INF/services/com.alibaba.csb.security.spi.SignService 文件里指定签名实现类(配置方式参见 Java标准的serviceLoader说明)。所有CSB请求都将使用此签名类。
  2. JVM参数 -Dcom.alibaba.csb.security.spi.SignService=your-impl-class 指定签名实现类。所有CSB请求都将使用此签名类。
  3. 特定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); //模拟签名算法
    }
}

支持SPI方式指定CSB服务端的验签实现类

自定义验签类部署

  1. 请自行将自定义验签类jar放置在CSB Broker的docker容器内的 /home/admin/cloud-gateway/patchlib 路径下。
  2. 设置admin用户对patchlib目录下jar文件有读取权限。
  3. 重启CSB Broker的docker容器。

自定义验签类指定方式

根据您的需求,选择客户端或服务端指定验签类的一种。如果客户端和服务端同时指定,则客户端指定优先。

CSB服务端指定

在自定义验签类jar内根目录的 META-INF/services/com.alibaba.csb.security.spi.VerifySignService 文件里指定验签实现类。所有CSB请求都将使用此验签类。

CSB客户端指定

CSB客户端发送请求时,通过附带HTTP头(_api_verify_sign_impl=your-verify-sign-impl-class)给CSB服务端,服务端在patchlib目录下的jar中加载此特定验签类,并对请求进行验签。 可以使用如下任意一种指定方式(如果2种方式同时配置,则方式2优先):

  1. 客户端JVM参数 -Dcom.alibaba.csb.security.spi.VerifySignService=your-verify-sign-impl-class 指定验签实现类。所有当前客户端发出的CSB请求都将指定为使用此验签类。
  2. 特定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)); //模拟验签算法
    }
}