@@ -16,7 +16,7 @@ import com.jd.blockchain.ledger.LedgerMetadata_V2; | |||||
import com.jd.blockchain.ledger.LedgerSettings; | import com.jd.blockchain.ledger.LedgerSettings; | ||||
import com.jd.blockchain.ledger.ParticipantNode; | import com.jd.blockchain.ledger.ParticipantNode; | ||||
import com.jd.blockchain.ledger.RolePrivilegeSettings; | import com.jd.blockchain.ledger.RolePrivilegeSettings; | ||||
import com.jd.blockchain.ledger.UserRolesSettings; | |||||
import com.jd.blockchain.ledger.UserAuthorizationSettings; | |||||
import com.jd.blockchain.storage.service.ExPolicyKVStorage; | import com.jd.blockchain.storage.service.ExPolicyKVStorage; | ||||
import com.jd.blockchain.storage.service.ExPolicyKVStorage.ExPolicy; | import com.jd.blockchain.storage.service.ExPolicyKVStorage.ExPolicy; | ||||
import com.jd.blockchain.storage.service.VersioningKVStorage; | import com.jd.blockchain.storage.service.VersioningKVStorage; | ||||
@@ -105,7 +105,7 @@ public class LedgerAdminDataset implements Transactional, LedgerAdminDataQuery, | |||||
} | } | ||||
@Override | @Override | ||||
public UserRolesSettings getUserRoles() { | |||||
public UserAuthorizationSettings getAuthorizations() { | |||||
return userRoles; | return userRoles; | ||||
} | } | ||||
@@ -17,7 +17,7 @@ import com.jd.blockchain.ledger.RolesPolicy; | |||||
import com.jd.blockchain.ledger.TransactionPermission; | import com.jd.blockchain.ledger.TransactionPermission; | ||||
import com.jd.blockchain.ledger.UserDoesNotExistException; | import com.jd.blockchain.ledger.UserDoesNotExistException; | ||||
import com.jd.blockchain.ledger.UserRoles; | import com.jd.blockchain.ledger.UserRoles; | ||||
import com.jd.blockchain.ledger.UserRolesSettings; | |||||
import com.jd.blockchain.ledger.UserAuthorizationSettings; | |||||
import com.jd.blockchain.utils.Bytes; | import com.jd.blockchain.utils.Bytes; | ||||
/** | /** | ||||
@@ -30,7 +30,7 @@ public class LedgerSecurityManagerImpl implements LedgerSecurityManager { | |||||
private RolePrivilegeSettings rolePrivilegeSettings; | private RolePrivilegeSettings rolePrivilegeSettings; | ||||
private UserRolesSettings userRolesSettings; | |||||
private UserAuthorizationSettings userRolesSettings; | |||||
// 用户的权限配置 | // 用户的权限配置 | ||||
private Map<Bytes, UserRolesPrivileges> userPrivilegesCache = new ConcurrentHashMap<>(); | private Map<Bytes, UserRolesPrivileges> userPrivilegesCache = new ConcurrentHashMap<>(); | ||||
@@ -41,7 +41,7 @@ public class LedgerSecurityManagerImpl implements LedgerSecurityManager { | |||||
private ParticipantDataQuery participantsQuery; | private ParticipantDataQuery participantsQuery; | ||||
private UserAccountQuery userAccountsQuery; | private UserAccountQuery userAccountsQuery; | ||||
public LedgerSecurityManagerImpl(RolePrivilegeSettings rolePrivilegeSettings, UserRolesSettings userRolesSettings, | |||||
public LedgerSecurityManagerImpl(RolePrivilegeSettings rolePrivilegeSettings, UserAuthorizationSettings userRolesSettings, | |||||
ParticipantDataQuery participantsQuery, UserAccountQuery userAccountsQuery) { | ParticipantDataQuery participantsQuery, UserAccountQuery userAccountsQuery) { | ||||
this.rolePrivilegeSettings = rolePrivilegeSettings; | this.rolePrivilegeSettings = rolePrivilegeSettings; | ||||
this.userRolesSettings = userRolesSettings; | this.userRolesSettings = userRolesSettings; | ||||
@@ -82,7 +82,7 @@ public class TransactionBatchProcessor implements TransactionBatchProcess { | |||||
LedgerDataQuery ledgerDataQuery = ledgerRepo.getDataSet(ledgerBlock); | LedgerDataQuery ledgerDataQuery = ledgerRepo.getDataSet(ledgerBlock); | ||||
LedgerAdminDataQuery previousAdminDataset = ledgerDataQuery.getAdminDataset(); | LedgerAdminDataQuery previousAdminDataset = ledgerDataQuery.getAdminDataset(); | ||||
this.securityManager = new LedgerSecurityManagerImpl(previousAdminDataset.getAdminInfo().getRolePrivileges(), | this.securityManager = new LedgerSecurityManagerImpl(previousAdminDataset.getAdminInfo().getRolePrivileges(), | ||||
previousAdminDataset.getAdminInfo().getUserRoles(), previousAdminDataset.getParticipantDataset(), | |||||
previousAdminDataset.getAdminInfo().getAuthorizations(), previousAdminDataset.getParticipantDataset(), | |||||
ledgerDataQuery.getUserAccountSet()); | ledgerDataQuery.getUserAccountSet()); | ||||
this.newBlockEditor = ledgerRepo.createNextBlock(); | this.newBlockEditor = ledgerRepo.createNextBlock(); | ||||
@@ -98,7 +98,7 @@ public class TransactionBatchProcessor implements TransactionBatchProcess { | |||||
LedgerAdminDataQuery previousAdminDataset = previousBlockDataset.getAdminDataset(); | LedgerAdminDataQuery previousAdminDataset = previousBlockDataset.getAdminDataset(); | ||||
LedgerSecurityManager securityManager = new LedgerSecurityManagerImpl( | LedgerSecurityManager securityManager = new LedgerSecurityManagerImpl( | ||||
previousAdminDataset.getAdminInfo().getRolePrivileges(), | previousAdminDataset.getAdminInfo().getRolePrivileges(), | ||||
previousAdminDataset.getAdminInfo().getUserRoles(), previousAdminDataset.getParticipantDataset(), | |||||
previousAdminDataset.getAdminInfo().getAuthorizations(), previousAdminDataset.getParticipantDataset(), | |||||
previousBlockDataset.getUserAccountSet()); | previousBlockDataset.getUserAccountSet()); | ||||
TransactionBatchProcessor processor = new TransactionBatchProcessor(securityManager, newBlockEditor, ledgerRepo, | TransactionBatchProcessor processor = new TransactionBatchProcessor(securityManager, newBlockEditor, ledgerRepo, | ||||
@@ -11,7 +11,7 @@ import com.jd.blockchain.ledger.MerkleProof; | |||||
import com.jd.blockchain.ledger.RoleSet; | import com.jd.blockchain.ledger.RoleSet; | ||||
import com.jd.blockchain.ledger.RolesPolicy; | import com.jd.blockchain.ledger.RolesPolicy; | ||||
import com.jd.blockchain.ledger.UserRoles; | import com.jd.blockchain.ledger.UserRoles; | ||||
import com.jd.blockchain.ledger.UserRolesSettings; | |||||
import com.jd.blockchain.ledger.UserAuthorizationSettings; | |||||
import com.jd.blockchain.storage.service.ExPolicyKVStorage; | import com.jd.blockchain.storage.service.ExPolicyKVStorage; | ||||
import com.jd.blockchain.storage.service.VersioningKVEntry; | import com.jd.blockchain.storage.service.VersioningKVEntry; | ||||
import com.jd.blockchain.storage.service.VersioningKVStorage; | import com.jd.blockchain.storage.service.VersioningKVStorage; | ||||
@@ -24,7 +24,7 @@ import com.jd.blockchain.utils.Transactional; | |||||
* @author huanghaiquan | * @author huanghaiquan | ||||
* | * | ||||
*/ | */ | ||||
public class UserRoleDataset implements Transactional, MerkleProvable, UserRolesSettings { | |||||
public class UserRoleDataset implements Transactional, MerkleProvable, UserAuthorizationSettings { | |||||
private MerkleDataSet dataset; | private MerkleDataSet dataset; | ||||
@@ -9,7 +9,7 @@ import com.jd.blockchain.ledger.RolesPolicy; | |||||
import com.jd.blockchain.ledger.UserAuthorizeOperation; | import com.jd.blockchain.ledger.UserAuthorizeOperation; | ||||
import com.jd.blockchain.ledger.UserAuthorizeOperation.UserRolesEntry; | import com.jd.blockchain.ledger.UserAuthorizeOperation.UserRolesEntry; | ||||
import com.jd.blockchain.ledger.UserRoles; | import com.jd.blockchain.ledger.UserRoles; | ||||
import com.jd.blockchain.ledger.UserRolesSettings; | |||||
import com.jd.blockchain.ledger.UserAuthorizationSettings; | |||||
import com.jd.blockchain.ledger.core.LedgerDataset; | import com.jd.blockchain.ledger.core.LedgerDataset; | ||||
import com.jd.blockchain.ledger.core.LedgerQuery; | import com.jd.blockchain.ledger.core.LedgerQuery; | ||||
import com.jd.blockchain.ledger.core.MultiIDsPolicy; | import com.jd.blockchain.ledger.core.MultiIDsPolicy; | ||||
@@ -36,7 +36,7 @@ public class UserAuthorizeOperationHandle extends AbstractLedgerOperationHandle< | |||||
// 操作账本; | // 操作账本; | ||||
UserRolesEntry[] urcfgs = operation.getUserRolesAuthorizations(); | UserRolesEntry[] urcfgs = operation.getUserRolesAuthorizations(); | ||||
UserRolesSettings urSettings = newBlockDataset.getAdminDataset().getUserRoles(); | |||||
UserAuthorizationSettings urSettings = newBlockDataset.getAdminDataset().getAuthorizations(); | |||||
RolePrivilegeSettings rolesSettings = newBlockDataset.getAdminDataset().getRolePrivileges(); | RolePrivilegeSettings rolesSettings = newBlockDataset.getAdminDataset().getRolePrivileges(); | ||||
if (urcfgs != null) { | if (urcfgs != null) { | ||||
for (UserRolesEntry urcfg : urcfgs) { | for (UserRolesEntry urcfg : urcfgs) { | ||||
@@ -33,7 +33,7 @@ import com.jd.blockchain.ledger.RolePrivileges; | |||||
import com.jd.blockchain.ledger.RolesPolicy; | import com.jd.blockchain.ledger.RolesPolicy; | ||||
import com.jd.blockchain.ledger.TransactionPermission; | import com.jd.blockchain.ledger.TransactionPermission; | ||||
import com.jd.blockchain.ledger.UserRoles; | import com.jd.blockchain.ledger.UserRoles; | ||||
import com.jd.blockchain.ledger.UserRolesSettings; | |||||
import com.jd.blockchain.ledger.UserAuthorizationSettings; | |||||
import com.jd.blockchain.ledger.core.CryptoConfig; | import com.jd.blockchain.ledger.core.CryptoConfig; | ||||
import com.jd.blockchain.ledger.core.LedgerAdminDataset; | import com.jd.blockchain.ledger.core.LedgerAdminDataset; | ||||
import com.jd.blockchain.ledger.core.LedgerConfiguration; | import com.jd.blockchain.ledger.core.LedgerConfiguration; | ||||
@@ -100,7 +100,7 @@ public class LedgerAdminDatasetTest { | |||||
new TransactionPermission[] { TransactionPermission.DIRECT_OPERATION, | new TransactionPermission[] { TransactionPermission.DIRECT_OPERATION, | ||||
TransactionPermission.CONTRACT_OPERATION }); | TransactionPermission.CONTRACT_OPERATION }); | ||||
ledgerAdminDataset.getUserRoles().addUserRoles(parties[0].getAddress(), RolesPolicy.UNION, "DEFAULT"); | |||||
ledgerAdminDataset.getAuthorizations().addUserRoles(parties[0].getAddress(), RolesPolicy.UNION, "DEFAULT"); | |||||
// New created instance is updated until being committed; | // New created instance is updated until being committed; | ||||
assertTrue(ledgerAdminDataset.isUpdated()); | assertTrue(ledgerAdminDataset.isUpdated()); | ||||
@@ -148,7 +148,7 @@ public class LedgerAdminDatasetTest { | |||||
verifyReadonlyState(reloadAdminAccount1); | verifyReadonlyState(reloadAdminAccount1); | ||||
verifyRealoadingRoleAuthorizations(reloadAdminAccount1, ledgerAdminDataset.getRolePrivileges(), | verifyRealoadingRoleAuthorizations(reloadAdminAccount1, ledgerAdminDataset.getRolePrivileges(), | ||||
ledgerAdminDataset.getUserRoles()); | |||||
ledgerAdminDataset.getAuthorizations()); | |||||
// -------------- | // -------------- | ||||
// 重新加载,并进行修改; | // 重新加载,并进行修改; | ||||
@@ -168,7 +168,7 @@ public class LedgerAdminDatasetTest { | |||||
reloadAdminAccount2.getRolePrivileges().disablePermissions("DEFAULT", TransactionPermission.CONTRACT_OPERATION); | reloadAdminAccount2.getRolePrivileges().disablePermissions("DEFAULT", TransactionPermission.CONTRACT_OPERATION); | ||||
reloadAdminAccount2.getUserRoles().addUserRoles(parties[1].getAddress(), RolesPolicy.UNION, "DEFAULT", "ADMIN"); | |||||
reloadAdminAccount2.getAuthorizations().addUserRoles(parties[1].getAddress(), RolesPolicy.UNION, "DEFAULT", "ADMIN"); | |||||
reloadAdminAccount2.commit(); | reloadAdminAccount2.commit(); | ||||
@@ -228,7 +228,7 @@ public class LedgerAdminDatasetTest { | |||||
} | } | ||||
private void verifyRealoadingRoleAuthorizations(LedgerAdminSettings actualAccount, | private void verifyRealoadingRoleAuthorizations(LedgerAdminSettings actualAccount, | ||||
RolePrivilegeSettings expRolePrivilegeSettings, UserRolesSettings expUserRoleSettings) { | |||||
RolePrivilegeSettings expRolePrivilegeSettings, UserAuthorizationSettings expUserRoleSettings) { | |||||
// 验证基本信息; | // 验证基本信息; | ||||
RolePrivilegeSettings actualRolePrivileges = actualAccount.getRolePrivileges(); | RolePrivilegeSettings actualRolePrivileges = actualAccount.getRolePrivileges(); | ||||
RolePrivileges[] expRPs = expRolePrivilegeSettings.getRolePrivileges(); | RolePrivileges[] expRPs = expRolePrivilegeSettings.getRolePrivileges(); | ||||
@@ -242,12 +242,12 @@ public class LedgerAdminDatasetTest { | |||||
assertArrayEquals(expRP.getTransactionPrivilege().toBytes(), actualRP.getTransactionPrivilege().toBytes()); | assertArrayEquals(expRP.getTransactionPrivilege().toBytes(), actualRP.getTransactionPrivilege().toBytes()); | ||||
} | } | ||||
UserRolesSettings actualUserRoleSettings = actualAccount.getUserRoles(); | |||||
UserAuthorizationSettings actualUserRoleSettings = actualAccount.getAuthorizations(); | |||||
UserRoles[] expUserRoles = expUserRoleSettings.getUserRoles(); | UserRoles[] expUserRoles = expUserRoleSettings.getUserRoles(); | ||||
assertEquals(expUserRoles.length, actualUserRoleSettings.getUserCount()); | assertEquals(expUserRoles.length, actualUserRoleSettings.getUserCount()); | ||||
for (UserRoles expUR : expUserRoles) { | for (UserRoles expUR : expUserRoles) { | ||||
UserRoles actualUR = actualAccount.getUserRoles().getUserRoles(expUR.getUserAddress()); | |||||
UserRoles actualUR = actualAccount.getAuthorizations().getUserRoles(expUR.getUserAddress()); | |||||
assertNotNull(actualUR); | assertNotNull(actualUR); | ||||
assertEquals(expUR.getPolicy(), actualUR.getPolicy()); | assertEquals(expUR.getPolicy(), actualUR.getPolicy()); | ||||
String[] expRoles = expUR.getRoles(); | String[] expRoles = expUR.getRoles(); | ||||
@@ -2,7 +2,7 @@ package com.jd.blockchain.ledger; | |||||
public interface LedgerAdminSettings extends LedgerAdminInfo { | public interface LedgerAdminSettings extends LedgerAdminInfo { | ||||
UserRolesSettings getUserRoles(); | |||||
UserAuthorizationSettings getAuthorizations(); | |||||
RolePrivilegeSettings getRolePrivileges(); | RolePrivilegeSettings getRolePrivileges(); | ||||
} | } |
@@ -4,7 +4,7 @@ import java.util.Collection; | |||||
import com.jd.blockchain.utils.Bytes; | import com.jd.blockchain.utils.Bytes; | ||||
public interface UserRolesSettings { | |||||
public interface UserAuthorizationSettings { | |||||
/** | /** | ||||
* 单一用户可被授权的角色数量的最大值; | * 单一用户可被授权的角色数量的最大值; |
@@ -22,8 +22,8 @@ public class UserAuthorizeOpTemplate implements UserAuthorizer, UserAuthorizeOpe | |||||
DataContractRegistry.register(UserRolesEntry.class); | DataContractRegistry.register(UserRolesEntry.class); | ||||
} | } | ||||
private Set<UserRolesAuthorization> userAuthMap = Collections | |||||
.synchronizedSet(new LinkedHashSet<UserRolesAuthorization>()); | |||||
private Set<AuthorizationDataEntry> userAuthMap = Collections | |||||
.synchronizedSet(new LinkedHashSet<AuthorizationDataEntry>()); | |||||
public UserAuthorizeOpTemplate() { | public UserAuthorizeOpTemplate() { | ||||
} | } | ||||
@@ -32,8 +32,8 @@ public class UserAuthorizeOpTemplate implements UserAuthorizer, UserAuthorizeOpe | |||||
} | } | ||||
@Override | @Override | ||||
public UserRolesAuthorization[] getUserRolesAuthorizations() { | |||||
return ArrayUtils.toArray(userAuthMap, UserRolesAuthorization.class); | |||||
public AuthorizationDataEntry[] getUserRolesAuthorizations() { | |||||
return ArrayUtils.toArray(userAuthMap, AuthorizationDataEntry.class); | |||||
} | } | ||||
@Override | @Override | ||||
@@ -43,7 +43,7 @@ public class UserAuthorizeOpTemplate implements UserAuthorizer, UserAuthorizeOpe | |||||
@Override | @Override | ||||
public UserRolesAuthorizer forUser(Bytes... userAddresses) { | public UserRolesAuthorizer forUser(Bytes... userAddresses) { | ||||
UserRolesAuthorization userRolesAuth = new UserRolesAuthorization(userAddresses); | |||||
AuthorizationDataEntry userRolesAuth = new AuthorizationDataEntry(userAddresses); | |||||
userAuthMap.add(userRolesAuth); | userAuthMap.add(userRolesAuth); | ||||
return userRolesAuth; | return userRolesAuth; | ||||
} | } | ||||
@@ -54,7 +54,7 @@ public class UserAuthorizeOpTemplate implements UserAuthorizer, UserAuthorizeOpe | |||||
return forUser(addresses); | return forUser(addresses); | ||||
} | } | ||||
private class UserRolesAuthorization implements UserRolesAuthorizer, UserRolesEntry { | |||||
private class AuthorizationDataEntry implements UserRolesAuthorizer, UserRolesEntry { | |||||
private Bytes[] userAddress; | private Bytes[] userAddress; | ||||
@@ -63,7 +63,7 @@ public class UserAuthorizeOpTemplate implements UserAuthorizer, UserAuthorizeOpe | |||||
private Set<String> authRoles = new LinkedHashSet<String>(); | private Set<String> authRoles = new LinkedHashSet<String>(); | ||||
private Set<String> unauthRoles = new LinkedHashSet<String>(); | private Set<String> unauthRoles = new LinkedHashSet<String>(); | ||||
private UserRolesAuthorization(Bytes[] userAddress) { | |||||
private AuthorizationDataEntry(Bytes[] userAddress) { | |||||
this.userAddress = userAddress; | this.userAddress = userAddress; | ||||
} | } | ||||
@@ -9,6 +9,7 @@ import java.io.IOException; | |||||
import java.io.InputStream; | import java.io.InputStream; | ||||
import java.util.Arrays; | import java.util.Arrays; | ||||
import java.util.HashSet; | import java.util.HashSet; | ||||
import java.util.Iterator; | |||||
import java.util.Set; | import java.util.Set; | ||||
import org.junit.Test; | import org.junit.Test; | ||||
@@ -36,9 +37,12 @@ import com.jd.blockchain.ledger.TransactionBuilder; | |||||
import com.jd.blockchain.ledger.TransactionPermission; | import com.jd.blockchain.ledger.TransactionPermission; | ||||
import com.jd.blockchain.ledger.TransactionRequest; | import com.jd.blockchain.ledger.TransactionRequest; | ||||
import com.jd.blockchain.ledger.TransactionRequestBuilder; | import com.jd.blockchain.ledger.TransactionRequestBuilder; | ||||
import com.jd.blockchain.ledger.TransactionResponse; | |||||
import com.jd.blockchain.ledger.TransactionState; | |||||
import com.jd.blockchain.ledger.UserAuthorizeOperation; | import com.jd.blockchain.ledger.UserAuthorizeOperation; | ||||
import com.jd.blockchain.ledger.UserRegisterOperation; | import com.jd.blockchain.ledger.UserRegisterOperation; | ||||
import com.jd.blockchain.ledger.UserRoles; | import com.jd.blockchain.ledger.UserRoles; | ||||
import com.jd.blockchain.ledger.core.DataAccount; | |||||
import com.jd.blockchain.ledger.core.DefaultOperationHandleRegisteration; | import com.jd.blockchain.ledger.core.DefaultOperationHandleRegisteration; | ||||
import com.jd.blockchain.ledger.core.LedgerInitializer; | import com.jd.blockchain.ledger.core.LedgerInitializer; | ||||
import com.jd.blockchain.ledger.core.LedgerManager; | import com.jd.blockchain.ledger.core.LedgerManager; | ||||
@@ -46,6 +50,7 @@ import com.jd.blockchain.ledger.core.LedgerQuery; | |||||
import com.jd.blockchain.ledger.core.LedgerRepository; | import com.jd.blockchain.ledger.core.LedgerRepository; | ||||
import com.jd.blockchain.ledger.core.OperationHandleRegisteration; | import com.jd.blockchain.ledger.core.OperationHandleRegisteration; | ||||
import com.jd.blockchain.ledger.core.TransactionBatchProcessor; | import com.jd.blockchain.ledger.core.TransactionBatchProcessor; | ||||
import com.jd.blockchain.ledger.core.UserAccount; | |||||
import com.jd.blockchain.service.TransactionBatchResult; | import com.jd.blockchain.service.TransactionBatchResult; | ||||
import com.jd.blockchain.service.TransactionBatchResultHandle; | import com.jd.blockchain.service.TransactionBatchResultHandle; | ||||
import com.jd.blockchain.storage.service.KVStorageService; | import com.jd.blockchain.storage.service.KVStorageService; | ||||
@@ -79,6 +84,8 @@ public class RolesAuthorizationTest { | |||||
private static final BlockchainKeypair DEFAULT_USER; | private static final BlockchainKeypair DEFAULT_USER; | ||||
private static final BlockchainKeypair GUEST_USER; | private static final BlockchainKeypair GUEST_USER; | ||||
// 预置的新普通用户; | |||||
private static final BlockchainKeypair NEW_USER = BlockchainKeyGenerator.getInstance().generate(); | |||||
// 预置的数据账户; | // 预置的数据账户; | ||||
private static final BlockchainIdentity DATA_ACCOUNT_ID = BlockchainKeyGenerator.getInstance().generate() | private static final BlockchainIdentity DATA_ACCOUNT_ID = BlockchainKeyGenerator.getInstance().generate() | ||||
.getIdentity(); | .getIdentity(); | ||||
@@ -107,24 +114,123 @@ public class RolesAuthorizationTest { | |||||
public void test() { | public void test() { | ||||
MemoryKVStorage storage = new MemoryKVStorage(); | MemoryKVStorage storage = new MemoryKVStorage(); | ||||
LedgerBlock genesisBlock = initLedger(storage); | LedgerBlock genesisBlock = initLedger(storage); | ||||
final HashDigest ledgerHash = genesisBlock.getHash(); | |||||
LedgerManager ledgerManager = new LedgerManager(); | LedgerManager ledgerManager = new LedgerManager(); | ||||
LedgerRepository ledger = ledgerManager.register(genesisBlock.getHash(), storage); | |||||
LedgerRepository ledger = ledgerManager.register(ledgerHash, storage); | |||||
// 验证角色和用户的权限配置; | // 验证角色和用户的权限配置; | ||||
assertUserRolesPermissions(ledger); | assertUserRolesPermissions(ledger); | ||||
// 预置数据; | |||||
TransactionRequest tx = buildRequest(ledger.getHash(), ADMIN_USER, ADMIN_USER, new TransactionDefiner() { | |||||
// 预置数据:准备一个新用户和数据账户; | |||||
TransactionRequest predefinedTx = buildRequest(ledger.getHash(), ADMIN_USER, ADMIN_USER, | |||||
new TransactionDefiner() { | |||||
@Override | |||||
public void define(TransactionBuilder txBuilder) { | |||||
txBuilder.security().roles().configure("NORMAL").enable(LedgerPermission.REGISTER_DATA_ACCOUNT) | |||||
.disable(LedgerPermission.REGISTER_USER) | |||||
.enable(TransactionPermission.CONTRACT_OPERATION); | |||||
txBuilder.users().register(NEW_USER.getIdentity()); | |||||
txBuilder.security().authorziations().forUser(NEW_USER.getAddress()).authorize("NORMAL"); | |||||
txBuilder.dataAccounts().register(DATA_ACCOUNT_ID); | |||||
} | |||||
}); | |||||
TransactionBatchResult procResult = executeTransactions(ledger, predefinedTx); | |||||
//断言预定义数据的交易和区块成功; | |||||
assertBlock(1, procResult); | |||||
assertTransactionAllSuccess(procResult); | |||||
//断言预定义的数据符合预期; | |||||
assertPredefineData(ledgerHash, storage); | |||||
// 用不具备“注册用户”权限的用户,注册另一个新用户,预期交易失败; | |||||
BlockchainKeypair tempUser = BlockchainKeyGenerator.getInstance().generate(); | |||||
TransactionRequest tx = buildRequest(ledger.getHash(), NEW_USER, ADMIN_USER, new TransactionDefiner() { | |||||
@Override | @Override | ||||
public void define(TransactionBuilder txBuilder) { | public void define(TransactionBuilder txBuilder) { | ||||
txBuilder.dataAccounts().register(DATA_ACCOUNT_ID); | |||||
txBuilder.users().register(tempUser.getIdentity()); | |||||
} | } | ||||
}); | }); | ||||
TransactionBatchResult procResult = executeTransactions(ledger, tx); | |||||
assertEquals(1, procResult.getBlock().getHeight()); | |||||
procResult = executeTransactions(ledger, tx); | |||||
assertBlock(2, procResult); | |||||
assertTransactionAllFail(procResult, TransactionState.REJECTED_BY_SECURITY_POLICY); | |||||
} | |||||
/** | |||||
* 断言区块高度; | |||||
* | |||||
* @param blockHeight | |||||
* @param procResult | |||||
*/ | |||||
private void assertBlock(long blockHeight, TransactionBatchResult procResult) { | |||||
assertEquals(blockHeight, procResult.getBlock().getHeight()); | |||||
} | |||||
/** | |||||
* 断言全部交易结果都是成功的; | |||||
* | |||||
* @param procResult | |||||
*/ | |||||
private void assertTransactionAllSuccess(TransactionBatchResult procResult) { | |||||
Iterator<TransactionResponse> responses = procResult.getResponses(); | |||||
while (responses.hasNext()) { | |||||
TransactionResponse transactionResponse = (TransactionResponse) responses.next(); | |||||
assertEquals(true, transactionResponse.isSuccess()); | |||||
assertEquals(TransactionState.SUCCESS, transactionResponse.getExecutionState()); | |||||
assertEquals(procResult.getBlock().getHash(), transactionResponse.getBlockHash()); | |||||
assertEquals(procResult.getBlock().getHeight(), transactionResponse.getBlockHeight()); | |||||
} | |||||
} | |||||
/** | |||||
* 断言全部交易结果都是失败的; | |||||
* | |||||
* @param procResult | |||||
*/ | |||||
private void assertTransactionAllFail(TransactionBatchResult procResult, TransactionState txState) { | |||||
Iterator<TransactionResponse> responses = procResult.getResponses(); | |||||
while (responses.hasNext()) { | |||||
TransactionResponse transactionResponse = (TransactionResponse) responses.next(); | |||||
assertEquals(false, transactionResponse.isSuccess()); | |||||
assertEquals(txState, transactionResponse.getExecutionState()); | |||||
} | |||||
} | |||||
/** | |||||
* 断言预定义的数据符合预期; | |||||
* | |||||
* @param ledgerHash | |||||
* @param storage | |||||
*/ | |||||
private void assertPredefineData(HashDigest ledgerHash, MemoryKVStorage storage) { | |||||
LedgerManager ledgerManager = new LedgerManager(); | |||||
LedgerRepository ledger = ledgerManager.register(ledgerHash, storage); | |||||
UserAccount newUser = ledger.getUserAccountSet().getUser(NEW_USER.getAddress()); | |||||
assertNotNull(newUser); | |||||
DataAccount dataAccount = ledger.getDataAccountSet().getDataAccount(DATA_ACCOUNT_ID.getAddress()); | |||||
assertNotNull(dataAccount); | |||||
UserRoles userRoles = ledger.getAdminSettings().getAuthorizations().getUserRoles(NEW_USER.getAddress()); | |||||
assertNotNull(userRoles); | |||||
assertEquals(1, userRoles.getRoleCount()); | |||||
assertEquals("NORMAL", userRoles.getRoles()[0]); | |||||
RolePrivileges normalRole = ledger.getAdminSettings().getRolePrivileges().getRolePrivilege("NORMAL"); | |||||
assertNotNull(normalRole); | |||||
assertEquals(true, normalRole.getLedgerPrivilege().isEnable(LedgerPermission.REGISTER_DATA_ACCOUNT)); | |||||
assertEquals(false, normalRole.getLedgerPrivilege().isEnable(LedgerPermission.REGISTER_USER)); | |||||
assertEquals(true, normalRole.getTransactionPrivilege().isEnable(TransactionPermission.CONTRACT_OPERATION)); | |||||
assertEquals(false, normalRole.getTransactionPrivilege().isEnable(TransactionPermission.DIRECT_OPERATION)); | |||||
} | } | ||||
private TransactionBatchResult executeTransactions(LedgerRepository ledger, TransactionRequest... transactions) { | private TransactionBatchResult executeTransactions(LedgerRepository ledger, TransactionRequest... transactions) { | ||||
@@ -192,7 +298,7 @@ public class RolesAuthorizationTest { | |||||
if (roles == null) { | if (roles == null) { | ||||
roles = new String[0]; | roles = new String[0]; | ||||
} | } | ||||
UserRoles userRoles = ledger.getAdminSettings().getUserRoles().getUserRoles(address); | |||||
UserRoles userRoles = ledger.getAdminSettings().getAuthorizations().getUserRoles(address); | |||||
assertNotNull(userRoles); | assertNotNull(userRoles); | ||||
assertEquals(policy, userRoles.getPolicy()); | assertEquals(policy, userRoles.getPolicy()); | ||||