社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
在前面介绍了java fabric的登记,如果想了解:
https://blog.csdn.net/datouniao1/article/details/103963631
那么接下来咱们来一起来探索另外的一个知识点 注册
既然要注册用户,那么我们肯定要创建一个用户,如何来创建用户
在fabric-java-jdk中有关于User实现类的说法
红线圈住的是fabric-java-jdk自己实现的user方法,我们看到的是在1.4之后就没有LocalUser方法了,但是我们可以自己实现一个User接口,在fabric-java-jdk的测试用例中有SampleUser实现类,我们这个地方可以用这个实现类:
/*
* Copyright 2016 DTCC, Fujitsu Australia Software Technology - All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.fabric.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Set;
import io.netty.util.internal.StringUtil;
import org.bouncycastle.util.encoders.Hex;
import org.hyperledger.fabric.sdk.Enrollment;
import org.hyperledger.fabric.sdk.User;
import org.hyperledger.fabric.sdk.security.CryptoSuite;
import org.hyperledger.fabric_ca.sdk.EnrollmentRequest;
import org.hyperledger.fabric_ca.sdk.HFCAClient;
import org.hyperledger.fabric_ca.sdk.exception.EnrollmentException;
import org.hyperledger.fabric_ca.sdk.exception.InvalidArgumentException;
import com.dao.util.StrUtil;
public class SampleUser implements User, Serializable {
private static final long serialVersionUID = 8077132186383604355L;
private String name;
private Set<String> roles;
private String account;
private String affiliation;
private String organization;
private String enrollmentSecret;
Enrollment enrollment = null; //need access in test env.
private transient SampleStore keyValStore;
private String keyValStoreName;
private transient CryptoSuite cryptoSuite;
public SampleUser(String name, String org, SampleStore fs, CryptoSuite cryptoSuite) {
this.name = name;
this.cryptoSuite = cryptoSuite;
this.keyValStore = fs;
this.organization = org;
this.keyValStoreName = toKeyValStoreName(this.name, org);
String memberStr = keyValStore.getValue(keyValStoreName);
if (null == memberStr) {
saveState();
} else {
restoreState();
}
}
static boolean isStored(String name, String org, SampleStore fs) {
return fs.hasValue(toKeyValStoreName(name, org));
}
public String getName() {
return this.name;
}
public Set<String> getRoles() {
return this.roles;
}
public void setRoles(Set<String> roles) {
this.roles = roles;
saveState();
}
public String getAccount() {
return this.account;
}
/**
* Set the account.
*
* @param account The account.
*/
public void setAccount(String account) {
this.account = account;
saveState();
}
public String getAffiliation() {
return this.affiliation;
}
/**
* Set the affiliation.
*
* @param affiliation the affiliation.
*/
public void setAffiliation(String affiliation) {
this.affiliation = affiliation;
saveState();
}
public Enrollment getEnrollment() {
return this.enrollment;
}
/**
* Determine if this name has been registered.
*
* @return {@code true} if registered; otherwise {@code false}.
*/
public boolean isRegistered() {
return !StrUtil.isObjBlank(enrollmentSecret);
}
/**
* Determine if this name has been enrolled.
*
* @return {@code true} if enrolled; otherwise {@code false}.
*/
public boolean isEnrolled() {
return this.enrollment != null;
}
/**
* Save the state of this user to the key value store.
*/
void saveState() {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
oos.flush();
keyValStore.setValue(keyValStoreName, Hex.toHexString(bos.toByteArray()));
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Restore the state of this user from the key value store (if found). If not found, do nothing.
*/
SampleUser restoreState() {
String memberStr = keyValStore.getValue(keyValStoreName);
if (null != memberStr) {
// The user was found in the key value store, so restore the
// state.
byte[] serialized = Hex.decode(memberStr);
ByteArrayInputStream bis = new ByteArrayInputStream(serialized);
try {
ObjectInputStream ois = new ObjectInputStream(bis);
SampleUser state = (SampleUser) ois.readObject();
if (state != null) {
this.name = state.name;
this.roles = state.roles;
this.account = state.account;
this.affiliation = state.affiliation;
this.organization = state.organization;
this.enrollmentSecret = state.enrollmentSecret;
this.enrollment = state.enrollment;
this.mspId = state.mspId;
return this;
}
} catch (Exception e) {
throw new RuntimeException(String.format("Could not restore state of member %s", this.name), e);
}
}
return null;
}
public String getEnrollmentSecret() {
return enrollmentSecret;
}
public void setEnrollmentSecret(String enrollmentSecret) {
this.enrollmentSecret = enrollmentSecret;
saveState();
}
public void setEnrollment(Enrollment enrollment) {
this.enrollment = enrollment;
saveState();
}
public void setIdemixEnrollment(Enrollment enrollment) {
this.enrollment = enrollment;
}
public static String toKeyValStoreName(String name, String org) {
return "user." + name + org;
}
public String getMspId() {
return mspId;
}
String mspId;
public void setMspId(String mspID) {
this.mspId = mspID;
saveState();
}
}
还有另外的几个方法:
SampleStore.java
/*
* Copyright 2016, 2017 DTCC, Fujitsu Australia Software Technology, IBM - All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.fabric.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Serializable;
import java.io.StringReader;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.PrivateKey;
import java.security.Security;
import java.security.spec.InvalidKeySpecException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
import org.bouncycastle.util.encoders.Hex;
import org.hyperledger.fabric.sdk.Channel;
import org.hyperledger.fabric.sdk.Enrollment;
import org.hyperledger.fabric.sdk.HFClient;
import org.hyperledger.fabric.sdk.exception.InvalidArgumentException;
import org.hyperledger.fabric.sdk.security.CryptoSuite;
/**
* A local file-based key value store.
*/
public class SampleStore {
private String file;
private Log logger = LogFactory.getLog(SampleStore.class);
private CryptoSuite cryptoSuite;
public SampleStore(File file) {
this.file = file.getAbsolutePath();
}
/**
* Get the value associated with name.
*
* @param name
* @return value associated with the name
*/
public String getValue(String name) {
Properties properties = loadProperties();
return properties.getProperty(name);
}
/**
* Has the value present.
*
* @param name
* @return true if it's present.
*/
public boolean hasValue(String name) {
Properties properties = loadProperties();
return properties.containsKey(name);
}
private Properties loadProperties() {
Properties properties = new Properties();
try (InputStream input = new FileInputStream(file)) {
properties.load(input);
input.close();
} catch (FileNotFoundException e) {
logger.info(String.format("Could not find the file "%s"", file));
} catch (IOException e) {
logger.warn(String.format("Could not load keyvalue store from file "%s", reason:%s",
file, e.getMessage()));
}
return properties;
}
/**
* Set the value associated with name.
*
* @param name The name of the parameter
* @param value Value for the parameter
*/
public void setValue(String name, String value) {
Properties properties = loadProperties();
try (
OutputStream output = new FileOutputStream(file)
) {
properties.setProperty(name, value);
properties.store(output, "");
output.close();
} catch (IOException e) {
logger.warn(String.format("Could not save the keyvalue store, reason:%s", e.getMessage()));
}
}
private final Map<String, SampleUser> members = new HashMap<>();
/**
* Get the user with a given name
*
* @param name
* @param org
* @return user
*/
public SampleUser getMember(String name, String org) {
// Try to get the SampleUser state from the cache
SampleUser sampleUser = members.get(SampleUser.toKeyValStoreName(name, org));
if (null != sampleUser) {
return sampleUser;
}
// Create the SampleUser and try to restore it's state from the key value store (if found).
sampleUser = new SampleUser(name, org, this, cryptoSuite);
return sampleUser;
}
/**
* Check if store has user.
*
* @param name
* @param org
* @return true if the user exists.
*/
public boolean hasMember(String name, String org) {
// Try to get the SampleUser state from the cache
if (members.containsKey(SampleUser.toKeyValStoreName(name, org))) {
return true;
}
return SampleUser.isStored(name, org, this);
}
/**
* Get the user with a given name
*
* @param name
* @param org
* @param mspId
* @param privateKeyFile
* @param certificateFile
* @return user
* @throws IOException
* @throws NoSuchAlgorithmException
* @throws NoSuchProviderException
* @throws InvalidKeySpecException
*/
public SampleUser getMember(String name, String org, String mspId, File privateKeyFile,
File certificateFile) throws IOException, NoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException {
try {
// Try to get the SampleUser state from the cache
SampleUser sampleUser = members.get(SampleUser.toKeyValStoreName(name, org));
if (null != sampleUser) {
return sampleUser;
}
// Create the SampleUser and try to restore it's state from the key value store (if found).
sampleUser = new SampleUser(name, org, this, cryptoSuite);
sampleUser.setMspId(mspId);
String certificate = new String(IOUtils.toByteArray(new FileInputStream(certificateFile)), "UTF-8");
PrivateKey privateKey = getPrivateKeyFromBytes(IOUtils.toByteArray(new FileInputStream(privateKeyFile)));
sampleUser.setEnrollment(new SampleStoreEnrollement(privateKey, certificate));
sampleUser.saveState();
return sampleUser;
} catch (IOException e) {
e.printStackTrace();
throw e;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
throw e;
} catch (NoSuchProviderException e) {
e.printStackTrace();
throw e;
} catch (InvalidKeySpecException e) {
e.printStackTrace();
throw e;
} catch (ClassCastException e) {
e.printStackTrace();
throw e;
}
}
static {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
}
static PrivateKey getPrivateKeyFromBytes(byte[] data) throws IOException, NoSuchProviderException, NoSuchAlgorithmException, InvalidKeySpecException {
final Reader pemReader = new StringReader(new String(data));
final PrivateKeyInfo pemPair;
try (PEMParser pemParser = new PEMParser(pemReader)) {
pemPair = (PrivateKeyInfo) pemParser.readObject();
}
PrivateKey privateKey = new JcaPEMKeyConverter().setProvider(BouncyCastleProvider.PROVIDER_NAME).getPrivateKey(pemPair);
return privateKey;
}
// Use this to make sure SDK is not dependent on HFCA enrollment for non-Idemix
static final class SampleStoreEnrollement implements Enrollment<
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!