Hyperledger fabric Hyperledger结构:实现链码级访问控制

Hyperledger fabric Hyperledger结构:实现链码级访问控制,hyperledger-fabric,hyperledger,hyperledger-chaincode,chaincode,Hyperledger Fabric,Hyperledger,Hyperledger Chaincode,Chaincode,我想对某些方法实现链式代码级别的访问控制。因此,例如,我希望仅当执行请求的用户具有与世界状态中请求的资产字段匹配的certein标识时,才能执行调用的chaincode方法 在这方面,官方文件说: “Chaincode可以通过调用GetCreator()来利用客户端(提交者)证书进行访问控制决策此外,Go shim还提供了扩展API,可从提交者的证书中提取客户身份,用于访问控制决策,无论是基于客户身份本身,还是基于组织身份,还是基于客户身份属性 例如,表示为键/值的资产可能包括客户身份作为值的一

我想对某些方法实现链式代码级别的访问控制。因此,例如,我希望仅当执行请求的用户具有与世界状态中请求的资产字段匹配的certein标识时,才能执行调用的chaincode方法

在这方面,官方文件说:

“Chaincode可以通过调用GetCreator()来利用客户端(提交者)证书进行访问控制决策此外,Go shim还提供了扩展API,可从提交者的证书中提取客户身份,用于访问控制决策,无论是基于客户身份本身,还是基于组织身份,还是基于客户身份属性

例如,表示为键/值的资产可能包括客户身份作为值的一部分(例如作为指示资产所有者的JSON属性),并且只有此客户端才有权在将来更新密钥/值。可以在链码中使用客户端标识库扩展API来检索此提交者信息,以做出此类访问控制决策。”

这完美地反映了我的情况:我的资产包含一个字段所有者,我希望只有作为该资产所有者的用户才能对资产执行remove方法,即,如果他的身份-用户名-匹配所有者字段

我的问题是,官方文档中提供的解决方案描述了使用“客户机标识(cid)库”(client identity,cid)从证书中提取用户信息的可能性。但在我的例子中,我有Java和Javascript中的链码,并且(我认为)我只能使用GetCreator()方法,该方法将用户证书作为字节数组的输出


如何从证书中提取所需的信息?可能吗?可以从我的Java和Javascript链码中使用CID库吗?

CID库只是一个语法糖包装器,有助于在链码中使用标识进行操作,基本上,在GoLang中提取信息的方法是:


    serializedID, _ := stub.GetCreator()

    sId := &msp.SerializedIdentity{}
    err := proto.Unmarshal(serializedID, sId)
    if err != nil {
        return shim.Error(fmt.Sprintf("Could not deserialize a SerializedIdentity, err %s", err))
    }

    bl, _ := pem.Decode(sId.IdBytes)
    if bl == nil {
        return shim.Error(fmt.Sprintf("Could not decode the PEM structure"))
    }
    cert, err := x509.ParseCertificate(bl.Bytes)
    if err != nil {
        return shim.Error(fmt.Sprintf("ParseCertificate failed %s", err))
    }

    fmt.Println(cert)
在Java中,可以通过以下方式完成:

        try {
            Identities.SerializedIdentity identity = Identities.SerializedIdentity.parseFrom(stub.getCreator()); 
            StringReader reader = new StringReader(identity.getIdBytes().toStringUtf8()); 
            PemReader pr = new PemReader(reader); 
            byte[] x509Data = pemReader.readPemObject().getContent();
            CertificateFactory factory = CertificateFactory.getInstance("X509"); 
            X509Certificate certificate = factory.generateCertificate(new ByteArrayInputStream(x509Data));

        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }

我也在寻找这个功能,但现在似乎已经添加了。将ClientIdentity.java添加到java chaincode中(请参阅),这允许查询证书以获取信息。期待它成为下一版本Fabric-v1.4.4的一部分。

很高兴它对您有所帮助。嗨!非常感谢你的回答,它非常有帮助。我用这段代码解决了这个问题(非常类似):``Identifies.SerializedDidEntity identity=Identifies.SerializedDidEntity.parseFrom(stub.getCreator());StringReader=新的StringReader(identity.getIdBytes().toStringUtf8());PemReader pr=新PemReader(读取器);字节[]x509Data=pemReader.readPemObject().getContent();CertificateFactory=CertificateFactory.getInstance(“X509”);X509Certificate=factory.generateCertificate(新的ByteArrayInputStream(x509Data));`非常感谢。