This is an automated email from the ASF dual-hosted git repository.
xiaoyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new be90e51 Add Authentication.getAllUsers() (#9840)
be90e51 is described below
commit be90e51ac593fb3d0dec149bed6effedf28fe89b
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Mar 26 20:26:20 2021 +0800
Add Authentication.getAllUsers() (#9840)
* Refactor PostgreSQLAuthenticationHandler
* Refactor MySQLAuthenticationHandler
* Add Authentication.getAllUsers()
* Refactor GovernanceMetaDataContexts with auth
* Fix test case
---
.../metadata/GovernanceMetaDataContexts.java | 99 ++++++++++++----------
.../metadata/GovernanceMetaDataContextsTest.java | 4 +-
.../core/facade/GovernanceFacadeTest.java | 4 +-
.../core/registry/RegistryCenterTest.java | 47 +++++-----
.../infra/metadata/auth/Authentication.java | 7 ++
.../auth/builtin/DefaultAuthentication.java | 5 ++
.../type/CreateUserStatementAuthRefresher.java | 2 +-
.../yaml/swapper/UserRuleYamlSwapperTest.java | 2 +-
.../metadata/MetaDataContextsBuilderTest.java | 6 +-
.../mysql/auth/MySQLAuthenticationHandler.java | 11 +--
.../auth/PostgreSQLAuthenticationHandler.java | 9 +-
11 files changed, 107 insertions(+), 89 deletions(-)
diff --git
a/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/metadata/GovernanceMetaDataContexts.java
b/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/metadata/GovernanceMetaDataContexts.java
index 0aec091..1cab314 100644
---
a/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/metadata/GovernanceMetaDataContexts.java
+++
b/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/metadata/GovernanceMetaDataContexts.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.governance.context.metadata;
+import com.google.common.base.Preconditions;
import com.google.common.collect.Maps;
import com.google.common.eventbus.Subscribe;
import
org.apache.shardingsphere.governance.core.event.model.auth.PrivilegeChangedEvent;
@@ -211,8 +212,9 @@ public final class GovernanceMetaDataContexts implements
MetaDataContexts {
*/
@Subscribe
public synchronized void renew(final UserRuleChangedEvent event) {
- metaDataContexts = new
StandardMetaDataContexts(metaDataContexts.getMetaDataMap(),
metaDataContexts.getExecutorEngine(), createAuthentication(event.getUsers()),
metaDataContexts.getProps());
- reloadPrivilege(event.getUsers());
+ Authentication authentication = createAuthentication(event.getUsers());
+ reloadPrivilege(authentication, event.getUsers());
+ metaDataContexts = new
StandardMetaDataContexts(metaDataContexts.getMetaDataMap(),
metaDataContexts.getExecutorEngine(), authentication,
metaDataContexts.getProps());
}
/**
@@ -222,8 +224,7 @@ public final class GovernanceMetaDataContexts implements
MetaDataContexts {
*/
@Subscribe
public synchronized void renew(final PrivilegeChangedEvent event) {
- Collection<ShardingSphereUser> users = event.getUsers();
- reloadPrivilege(users);
+ reloadPrivilege(metaDataContexts.getAuthentication(),
event.getUsers());
}
/**
@@ -308,12 +309,6 @@ public final class GovernanceMetaDataContexts implements
MetaDataContexts {
}
}
- private DefaultAuthentication createAuthentication(final
Collection<ShardingSphereUser> users) {
- DefaultAuthentication result = new DefaultAuthentication();
- result.init(getNewUsers(users), getModifiedUsers(users));
- return result;
- }
-
private ShardingSphereMetaData buildMetaData(final MetaDataPersistedEvent
event) throws SQLException {
String schemaName = event.getSchemaName();
if
(!governanceFacade.getRegistryCenter().hasDataSourceConfiguration(schemaName)) {
@@ -322,11 +317,11 @@ public final class GovernanceMetaDataContexts implements
MetaDataContexts {
if
(!governanceFacade.getRegistryCenter().hasRuleConfiguration(schemaName)) {
governanceFacade.getRegistryCenter().persistRuleConfigurations(schemaName, new
LinkedList<>());
}
- Map<String, Map<String, DataSource>> dataSourcesMap =
createDataSourcesMap(Collections.singletonMap(schemaName,
+ Map<String, Map<String, DataSource>> dataSourcesMap =
createDataSourcesMap(Collections.singletonMap(schemaName,
governanceFacade.getRegistryCenter().loadDataSourceConfigurations(schemaName)));
- MetaDataContextsBuilder metaDataContextsBuilder = new
MetaDataContextsBuilder(dataSourcesMap,
- Collections.singletonMap(schemaName,
governanceFacade.getRegistryCenter().loadRuleConfigurations(schemaName)),
-
metaDataContexts.getAuthentication().getAuthentication().keySet(),
metaDataContexts.getProps().getProps());
+ MetaDataContextsBuilder metaDataContextsBuilder = new
MetaDataContextsBuilder(dataSourcesMap,
+ Collections.singletonMap(schemaName,
governanceFacade.getRegistryCenter().loadRuleConfigurations(schemaName)),
+ metaDataContexts.getAuthentication().getAllUsers(),
metaDataContexts.getProps().getProps());
return
metaDataContextsBuilder.build().getMetaDataMap().get(schemaName);
}
@@ -338,6 +333,49 @@ public final class GovernanceMetaDataContexts implements
MetaDataContexts {
return result;
}
+ private Authentication createAuthentication(final
Collection<ShardingSphereUser> users) {
+ Authentication result = new DefaultAuthentication();
+ result.init(getNewUsers(users), getModifiedUsers(users));
+ return result;
+ }
+
+ // TODO is it correct for new users with super privilege by default?
+ private Collection<ShardingSphereUser> getNewUsers(final
Collection<ShardingSphereUser> users) {
+ return users.stream().filter(each ->
!metaDataContexts.getAuthentication().findUser(each.getGrantee()).isPresent()).collect(Collectors.toList());
+ }
+
+ private Map<ShardingSphereUser, ShardingSpherePrivilege>
getModifiedUsers(final Collection<ShardingSphereUser> users) {
+ Map<ShardingSphereUser, ShardingSpherePrivilege> result = new
HashMap<>(users.size(), 1);
+ for (ShardingSphereUser each : users) {
+ Optional<ShardingSphereUser> user =
metaDataContexts.getAuthentication().findUser(each.getGrantee());
+ if (user.isPresent()) {
+ Optional<ShardingSpherePrivilege> privilege =
metaDataContexts.getAuthentication().findPrivilege(user.get().getGrantee());
+ privilege.ifPresent(optional -> result.put(user.get(),
optional));
+ }
+ }
+ return result;
+ }
+
+ private void reloadPrivilege(final Authentication authentication, final
Collection<ShardingSphereUser> users) {
+ Optional<PrivilegeLoader> loader =
PrivilegeLoaderEngine.findPrivilegeLoader(metaDataContexts.getMetaDataMap().values().iterator().next().getResource().getDatabaseType());
+ if (loader.isPresent()) {
+ Map<ShardingSphereUser, ShardingSpherePrivilege> privileges =
PrivilegeBuilder.build(metaDataContexts.getMetaDataMap().values(), users,
metaDataContexts.getProps());
+
authentication.getAuthentication().putAll(getPrivilegesWithPassword(authentication,
privileges));
+ }
+ }
+
+ private Map<ShardingSphereUser, ShardingSpherePrivilege>
getPrivilegesWithPassword(final Authentication authentication, final
Map<ShardingSphereUser, ShardingSpherePrivilege> privileges) {
+ Map<ShardingSphereUser, ShardingSpherePrivilege> result = new
HashMap<>(privileges.size(), 1);
+ for (Entry<ShardingSphereUser, ShardingSpherePrivilege> entry :
privileges.entrySet()) {
+ if (privileges.containsKey(entry.getKey())) {
+ Optional<ShardingSphereUser> user =
authentication.findUser(entry.getKey().getGrantee());
+ Preconditions.checkState(user.isPresent());
+ result.put(user.get(), entry.getValue());
+ }
+ }
+ return result;
+ }
+
private ShardingSphereMetaData getChangedMetaData(final
ShardingSphereMetaData oldMetaData, final ShardingSphereSchema schema, final
String schemaName) {
// TODO refresh table addressing mapper
return new ShardingSphereMetaData(schemaName,
oldMetaData.getResource(), oldMetaData.getRuleMetaData(), schema);
@@ -345,7 +383,7 @@ public final class GovernanceMetaDataContexts implements
MetaDataContexts {
private ShardingSphereMetaData getChangedMetaData(final
ShardingSphereMetaData oldMetaData, final Collection<RuleConfiguration>
ruleConfigs) throws SQLException {
MetaDataContextsBuilder builder = new
MetaDataContextsBuilder(Collections.singletonMap(oldMetaData.getName(),
oldMetaData.getResource().getDataSources()),
- Collections.singletonMap(oldMetaData.getName(), ruleConfigs),
metaDataContexts.getAuthentication().getAuthentication().keySet(),
metaDataContexts.getProps().getProps());
+ Collections.singletonMap(oldMetaData.getName(), ruleConfigs),
metaDataContexts.getAuthentication().getAllUsers(),
metaDataContexts.getProps().getProps());
return builder.build().getMetaDataMap().values().iterator().next();
}
@@ -357,7 +395,7 @@ public final class GovernanceMetaDataContexts implements
MetaDataContexts {
Map<String, Map<String, DataSource>> dataSourcesMap =
Collections.singletonMap(oldMetaData.getName(),
getNewDataSources(oldMetaData.getResource().getDataSources(),
getAddedDataSources(oldMetaData, newDataSourceConfigs), modifiedDataSources,
deletedDataSources));
return new MetaDataContextsBuilder(dataSourcesMap,
Collections.singletonMap(oldMetaData.getName(),
oldMetaData.getRuleMetaData().getConfigurations()),
-
metaDataContexts.getAuthentication().getAuthentication().keySet(),
metaDataContexts.getProps().getProps()).build().getMetaDataMap().get(oldMetaData.getName());
+ metaDataContexts.getAuthentication().getAllUsers(),
metaDataContexts.getProps().getProps()).build().getMetaDataMap().get(oldMetaData.getName());
}
private Map<String, DataSource> getNewDataSources(final Map<String,
DataSource> oldDataSources,
@@ -399,33 +437,4 @@ public final class GovernanceMetaDataContexts implements
MetaDataContexts {
}
return result;
}
-
- private Collection<ShardingSphereUser> getNewUsers(final
Collection<ShardingSphereUser> users) {
- return users.stream().filter(each ->
!metaDataContexts.getAuthentication().findUser(each.getGrantee()).isPresent()).collect(Collectors.toList());
- }
-
- private Map<ShardingSphereUser, ShardingSpherePrivilege>
getModifiedUsers(final Collection<ShardingSphereUser> users) {
- Map<ShardingSphereUser, ShardingSpherePrivilege> result = new
LinkedHashMap<>();
- for (Entry<ShardingSphereUser, ShardingSpherePrivilege> entry :
metaDataContexts.getAuthentication().getAuthentication().entrySet()) {
- Optional<ShardingSphereUser> modified = users.stream().filter(each
-> each.getGrantee().equals(entry.getKey().getGrantee())).findFirst();
- modified.ifPresent(shardingSphereUser ->
result.put(shardingSphereUser, entry.getValue()));
- }
- return result;
- }
-
- private void reloadPrivilege(final Collection<ShardingSphereUser> users) {
- Optional<PrivilegeLoader> loader =
PrivilegeLoaderEngine.findPrivilegeLoader(metaDataContexts.getMetaDataMap().values().iterator().next().getResource().getDatabaseType());
- if (!loader.isPresent()) {
- return;
- }
- Map<ShardingSphereUser, ShardingSpherePrivilege> result =
PrivilegeBuilder.build(metaDataContexts.getMetaDataMap().values(), users,
metaDataContexts.getProps());
- for (Entry<ShardingSphereUser, ShardingSpherePrivilege> entry :
result.entrySet()) {
- Optional<ShardingSphereUser> user =
metaDataContexts.getAuthentication().getAuthentication().keySet().stream().filter(t
-> t.getGrantee().equals(entry.getKey().getGrantee())).findFirst();
- if (user.isPresent() && null != result.get(entry.getKey())) {
-
metaDataContexts.getAuthentication().getAuthentication().put(user.get(),
entry.getValue());
- } else if (!user.isPresent() && null !=
result.get(entry.getKey())) {
-
metaDataContexts.getAuthentication().getAuthentication().put(entry.getKey(),
entry.getValue());
- }
- }
- }
}
diff --git
a/shardingsphere-governance/shardingsphere-governance-context/src/test/java/org/apache/shardingsphere/governance/context/metadata/GovernanceMetaDataContextsTest.java
b/shardingsphere-governance/shardingsphere-governance-context/src/test/java/org/apache/shardingsphere/governance/context/metadata/GovernanceMetaDataContextsTest.java
index 00d4eaa..b41bf8b 100644
---
a/shardingsphere-governance/shardingsphere-governance-context/src/test/java/org/apache/shardingsphere/governance/context/metadata/GovernanceMetaDataContextsTest.java
+++
b/shardingsphere-governance/shardingsphere-governance-context/src/test/java/org/apache/shardingsphere/governance/context/metadata/GovernanceMetaDataContextsTest.java
@@ -163,9 +163,9 @@ public final class GovernanceMetaDataContextsTest {
@Test
public void assertAuthenticationChanged() {
DefaultAuthentication authentication = new DefaultAuthentication();
- UserRuleChangedEvent event = new
UserRuleChangedEvent(authentication.getAuthentication().keySet());
+ UserRuleChangedEvent event = new
UserRuleChangedEvent(authentication.getAllUsers());
governanceMetaDataContexts.renew(event);
-
assertThat(governanceMetaDataContexts.getAuthentication().getAuthentication().size(),
is(authentication.getAuthentication().size()));
+
assertThat(governanceMetaDataContexts.getAuthentication().getAllUsers().size(),
is(authentication.getAuthentication().size()));
}
@Test
diff --git
a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/facade/GovernanceFacadeTest.java
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/facade/GovernanceFacadeTest.java
index 1c603ba..3254b85 100644
---
a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/facade/GovernanceFacadeTest.java
+++
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/facade/GovernanceFacadeTest.java
@@ -75,9 +75,9 @@ public final class GovernanceFacadeTest {
authentication.getAuthentication().put(user, new
ShardingSpherePrivilege());
Properties props = new Properties();
governanceFacade.onlineInstance(
- Collections.singletonMap("sharding_db", dataSourceConfigMap),
ruleConfigurationMap, authentication.getAuthentication().keySet(), props);
+ Collections.singletonMap("sharding_db", dataSourceConfigMap),
ruleConfigurationMap, authentication.getAllUsers(), props);
verify(registryCenter).persistConfigurations("sharding_db",
dataSourceConfigMap, ruleConfigurationMap.get("sharding_db"), false);
-
verify(registryCenter).persistGlobalConfiguration(authentication.getAuthentication().keySet(),
props, false);
+
verify(registryCenter).persistGlobalConfiguration(authentication.getAllUsers(),
props, false);
verify(registryCenter).persistInstanceOnline();
verify(registryCenter).persistDataNodes();
verify(listenerManager).init();
diff --git
a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/RegistryCenterTest.java
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/RegistryCenterTest.java
index 6f60016..2735c9d 100644
---
a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/RegistryCenterTest.java
+++
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/RegistryCenterTest.java
@@ -52,7 +52,6 @@ import
org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatchers;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
@@ -175,8 +174,8 @@ public final class RegistryCenterTest {
public void
assertPersistConfigurationForShardingRuleWithoutAuthenticationAndIsNotOverwriteAndConfigurationIsExisted()
{
RegistryCenter registryCenter = new RegistryCenter(registryRepository);
registryCenter.persistConfigurations("sharding_db",
createDataSourceConfigurations(), createRuleConfigurations(), false);
-
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
ArgumentMatchers.any());
- verify(registryRepository).persist(eq("/metadata/sharding_db/rule"),
ArgumentMatchers.any());
+
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
any());
+ verify(registryRepository).persist(eq("/metadata/sharding_db/rule"),
any());
}
@Test
@@ -197,15 +196,15 @@ public final class RegistryCenterTest {
public void
assertPersistConfigurationForShardingRuleWithoutAuthenticationAndIsNotOverwriteAndConfigurationIsNotExisted()
{
RegistryCenter registryCenter = new RegistryCenter(registryRepository);
registryCenter.persistConfigurations("sharding_db",
createDataSourceConfigurations(), createRuleConfigurations(), false);
-
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
ArgumentMatchers.any());
- verify(registryRepository).persist(eq("/metadata/sharding_db/rule"),
ArgumentMatchers.any());
+
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
any());
+ verify(registryRepository).persist(eq("/metadata/sharding_db/rule"),
any());
}
@Test
public void
assertPersistConfigurationForShardingRuleWithoutAuthenticationAndIsOverwrite() {
RegistryCenter registryCenter = new RegistryCenter(registryRepository);
registryCenter.persistConfigurations("sharding_db",
createDataSourceConfigurations(), createRuleConfigurations(), true);
-
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
ArgumentMatchers.any());
+
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
any());
verify(registryRepository,
times(0)).persist("/metadata/sharding_db/rule", readYAML(SHARDING_RULE_YAML));
}
@@ -213,23 +212,23 @@ public final class RegistryCenterTest {
public void
assertPersistConfigurationForReplicaQueryRuleWithoutAuthenticationAndIsNotOverwriteAndConfigurationIsExisted()
{
RegistryCenter registryCenter = new RegistryCenter(registryRepository);
registryCenter.persistConfigurations("sharding_db",
createDataSourceConfigurations(), createReadWriteSplittingRuleConfiguration(),
false);
-
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
ArgumentMatchers.any());
- verify(registryRepository).persist(eq("/metadata/sharding_db/rule"),
ArgumentMatchers.any());
+
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
any());
+ verify(registryRepository).persist(eq("/metadata/sharding_db/rule"),
any());
}
@Test
public void
assertPersistConfigurationForReplicaQueryRuleWithoutAuthenticationAndIsNotOverwriteAndConfigurationIsNotExisted()
{
RegistryCenter registryCenter = new RegistryCenter(registryRepository);
registryCenter.persistConfigurations("sharding_db",
createDataSourceConfigurations(), createReadWriteSplittingRuleConfiguration(),
false);
-
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
ArgumentMatchers.any());
- verify(registryRepository).persist(eq("/metadata/sharding_db/rule"),
ArgumentMatchers.any());
+
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
any());
+ verify(registryRepository).persist(eq("/metadata/sharding_db/rule"),
any());
}
@Test
public void
assertPersistConfigurationForReadWriteSplittingWithoutAuthenticationAndIsOverwrite()
{
RegistryCenter registryCenter = new RegistryCenter(registryRepository);
registryCenter.persistConfigurations("sharding_db",
createDataSourceConfigurations(), createReadWriteSplittingRuleConfiguration(),
true);
-
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
ArgumentMatchers.any());
+
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
any());
verify(registryRepository,
times(0)).persist("/metadata/sharding_db/rule",
readYAML(READ_WRITE_SPLITTING_RULE_YAML));
}
@@ -237,7 +236,7 @@ public final class RegistryCenterTest {
public void
assertPersistConfigurationForDatabaseDiscoveryRuleWithoutAuthenticationAndIsOverwrite()
{
RegistryCenter registryCenter = new RegistryCenter(registryRepository);
registryCenter.persistConfigurations("sharding_db",
createDataSourceConfigurations(), createDatabaseDiscoveryRuleConfiguration(),
true);
-
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
ArgumentMatchers.any());
+
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
any());
verify(registryRepository,
times(0)).persist("/metadata/sharding_db/rule",
readYAML(DB_DISCOVERY_RULE_YAML));
}
@@ -253,15 +252,15 @@ public final class RegistryCenterTest {
public void
assertPersistConfigurationForShardingRuleWithAuthenticationAndIsNotOverwriteAndConfigurationIsNotExisted()
{
RegistryCenter registryCenter = new RegistryCenter(registryRepository);
registryCenter.persistConfigurations("sharding_db",
createDataSourceConfigurations(), createRuleConfigurations(), false);
-
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
ArgumentMatchers.any());
- verify(registryRepository).persist(eq("/metadata/sharding_db/rule"),
ArgumentMatchers.any());
+
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
any());
+ verify(registryRepository).persist(eq("/metadata/sharding_db/rule"),
any());
}
@Test
public void
assertPersistConfigurationForShardingRuleWithAuthenticationAndIsOverwrite() {
RegistryCenter registryCenter = new RegistryCenter(registryRepository);
registryCenter.persistConfigurations("sharding_db",
createDataSourceConfigurations(), createRuleConfigurations(), true);
-
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
ArgumentMatchers.any());
+
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
any());
verify(registryRepository,
times(0)).persist("/metadata/sharding_db/rule", readYAML(SHARDING_RULE_YAML));
}
@@ -269,23 +268,23 @@ public final class RegistryCenterTest {
public void
assertPersistConfigurationForReplicaQueryRuleWithAuthenticationAndIsNotOverwriteAndConfigurationIsExisted()
{
RegistryCenter registryCenter = new RegistryCenter(registryRepository);
registryCenter.persistConfigurations("sharding_db",
createDataSourceConfigurations(), createReadWriteSplittingRuleConfiguration(),
false);
-
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
ArgumentMatchers.any());
- verify(registryRepository).persist(eq("/metadata/sharding_db/rule"),
ArgumentMatchers.any());
+
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
any());
+ verify(registryRepository).persist(eq("/metadata/sharding_db/rule"),
any());
}
@Test
public void
assertPersistConfigurationForReadWriteSplittingRuleWithAuthenticationAndIsNotOverwriteAndConfigurationIsNotExisted()
{
RegistryCenter registryCenter = new RegistryCenter(registryRepository);
registryCenter.persistConfigurations("sharding_db",
createDataSourceConfigurations(), createReadWriteSplittingRuleConfiguration(),
false);
-
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
ArgumentMatchers.any());
- verify(registryRepository).persist(eq("/metadata/sharding_db/rule"),
ArgumentMatchers.any());
+
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
any());
+ verify(registryRepository).persist(eq("/metadata/sharding_db/rule"),
any());
}
@Test
public void
assertPersistConfigurationForReadWriteSplittingRuleWithAuthenticationAndIsOverwrite()
{
RegistryCenter registryCenter = new RegistryCenter(registryRepository);
registryCenter.persistConfigurations("sharding_db",
createDataSourceConfigurations(), createReadWriteSplittingRuleConfiguration(),
true);
-
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
ArgumentMatchers.any());
+
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
any());
verify(registryRepository,
times(0)).persist("/metadata/sharding_db/rule",
readYAML(READ_WRITE_SPLITTING_RULE_YAML));
}
@@ -293,7 +292,7 @@ public final class RegistryCenterTest {
public void
assertPersistConfigurationForDatabaseDiscoveryRuleWithAuthenticationAndIsOverwrite()
{
RegistryCenter registryCenter = new RegistryCenter(registryRepository);
registryCenter.persistConfigurations("sharding_db",
createDataSourceConfigurations(), createDatabaseDiscoveryRuleConfiguration(),
true);
-
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
ArgumentMatchers.any());
+
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
any());
verify(registryRepository,
times(0)).persist("/metadata/sharding_db/rule",
readYAML(DB_DISCOVERY_RULE_YAML));
}
@@ -301,7 +300,7 @@ public final class RegistryCenterTest {
public void assertPersistConfigurationForEncrypt() {
RegistryCenter registryCenter = new RegistryCenter(registryRepository);
registryCenter.persistConfigurations("sharding_db",
createDataSourceConfigurations(), createEncryptRuleConfiguration(), true);
-
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
ArgumentMatchers.any());
+
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
any());
verify(registryRepository,
times(0)).persist("/metadata/sharding_db/rule", readYAML(ENCRYPT_RULE_YAML));
}
@@ -315,14 +314,14 @@ public final class RegistryCenterTest {
public void assertPersistConfigurationForShadow() {
RegistryCenter registryCenter = new RegistryCenter(registryRepository);
registryCenter.persistConfigurations("sharding_db",
createDataSourceConfigurations(), createShadowRuleConfiguration(), true);
-
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
ArgumentMatchers.any());
+
verify(registryRepository).persist(eq("/metadata/sharding_db/datasource"),
any());
verify(registryRepository,
times(0)).persist("/metadata/sharding_db/rule", readYAML(SHADOW_RULE_YAML));
}
@Test
public void assertPersistGlobalConfiguration() {
RegistryCenter registryCenter = new RegistryCenter(registryRepository);
-
registryCenter.persistGlobalConfiguration(createAuthentication().getAuthentication().keySet(),
createProperties(), true);
+
registryCenter.persistGlobalConfiguration(createAuthentication().getAllUsers(),
createProperties(), true);
verify(registryRepository, times(0)).persist("/authentication",
readYAML(AUTHENTICATION_YAML));
verify(registryRepository).persist("/props", PROPS_YAML);
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/Authentication.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/Authentication.java
index f2530ea..02f61c0 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/Authentication.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/Authentication.java
@@ -46,6 +46,13 @@ public interface Authentication {
Map<ShardingSphereUser, ShardingSpherePrivilege> getAuthentication();
/**
+ * Get all users.
+ *
+ * @return all users
+ */
+ Collection<ShardingSphereUser> getAllUsers();
+
+ /**
* Find user.
*
* @param grantee grantee
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builtin/DefaultAuthentication.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builtin/DefaultAuthentication.java
index 348a190..159cc4e 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builtin/DefaultAuthentication.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builtin/DefaultAuthentication.java
@@ -51,6 +51,11 @@ public final class DefaultAuthentication implements
Authentication {
}
@Override
+ public Collection<ShardingSphereUser> getAllUsers() {
+ return authentication.keySet();
+ }
+
+ @Override
public Optional<ShardingSphereUser> findUser(final Grantee grantee) {
return authentication.keySet().stream().filter(each ->
each.getGrantee().equals(grantee)).findFirst();
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/refresher/type/CreateUserStatementAuthRefresher.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/refresher/type/CreateUserStatementAuthRefresher.java
index b0fcc9b..97929a0 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/refresher/type/CreateUserStatementAuthRefresher.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/refresher/type/CreateUserStatementAuthRefresher.java
@@ -38,7 +38,7 @@ public final class CreateUserStatementAuthRefresher
implements AuthenticationRef
@Override
public void refresh(final Authentication authentication, final
SQLStatement sqlStatement, final ShardingSphereMetaData metaData) {
Collection<ShardingSphereUser> users =
generateUsers((CreateUserStatement) sqlStatement);
- users.addAll(authentication.getAuthentication().keySet());
+ users.addAll(authentication.getAllUsers());
ShardingSphereEventBus.getInstance().post(new CreateUserEvent(users));
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/auth/builtin/yaml/swapper/UserRuleYamlSwapperTest.java
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/auth/builtin/yaml/swapper/UserRuleYamlSwapperTest.java
index d5cc037..007af86 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/auth/builtin/yaml/swapper/UserRuleYamlSwapperTest.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/auth/builtin/yaml/swapper/UserRuleYamlSwapperTest.java
@@ -42,7 +42,7 @@ public final class UserRuleYamlSwapperTest {
DefaultAuthentication authentication = new DefaultAuthentication();
authentication.getAuthentication().put(new ShardingSphereUser("user1",
"pwd1", "127.0.0.1"), new ShardingSpherePrivilege());
authentication.getAuthentication().put(new ShardingSphereUser("user2",
"pwd2", "127.0.0.2"), new ShardingSpherePrivilege());
- YamlUserRuleConfiguration actual = new
UserRuleYamlSwapper().swapToYamlConfiguration(authentication.getAuthentication().keySet());
+ YamlUserRuleConfiguration actual = new
UserRuleYamlSwapper().swapToYamlConfiguration(authentication.getAllUsers());
assertThat(actual.getUsers().size(), is(2));
assertThat(actual.getUsers().get("user1").getPassword(), is("pwd1"));
assertThat(actual.getUsers().get("user1").getHostname(),
is("127.0.0.1"));
diff --git
a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/metadata/MetaDataContextsBuilderTest.java
b/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/metadata/MetaDataContextsBuilderTest.java
index 8d6deaf..86395d8 100644
---
a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/metadata/MetaDataContextsBuilderTest.java
+++
b/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/metadata/MetaDataContextsBuilderTest.java
@@ -41,7 +41,7 @@ public final class MetaDataContextsBuilderTest {
public void assertBuildWithoutConfiguration() throws SQLException {
MetaDataContexts actual = new
MetaDataContextsBuilder(Collections.emptyMap(), Collections.emptyMap(),
null).build();
assertTrue(actual.getAllSchemaNames().isEmpty());
- assertTrue(actual.getAuthentication().getAuthentication().isEmpty());
+ assertTrue(actual.getAuthentication().getAllUsers().isEmpty());
assertTrue(actual.getProps().getProps().isEmpty());
}
@@ -53,7 +53,7 @@ public final class MetaDataContextsBuilderTest {
Collections.singletonMap("logic_db", Collections.emptyMap()),
Collections.singletonMap("logic_db", Collections.singleton(new
FixtureRuleConfiguration())), props).build();
assertRules(actual);
assertTrue(actual.getMetaData("logic_db").getResource().getDataSources().isEmpty());
- assertTrue(actual.getAuthentication().getAuthentication().isEmpty());
+ assertTrue(actual.getAuthentication().getAllUsers().isEmpty());
assertThat(actual.getProps().getProps().size(), is(1));
assertThat(actual.getProps().getValue(ConfigurationPropertyKey.EXECUTOR_SIZE),
is(1));
}
@@ -66,7 +66,7 @@ public final class MetaDataContextsBuilderTest {
Collections.singletonMap("logic_db", Collections.singleton(new
FixtureRuleConfiguration())), props).build();
assertRules(actual);
assertDataSources(actual);
- assertTrue(actual.getAuthentication().getAuthentication().isEmpty());
+ assertTrue(actual.getAuthentication().getAllUsers().isEmpty());
assertThat(actual.getProps().getProps().size(), is(1));
assertThat(actual.getProps().getValue(ConfigurationPropertyKey.EXECUTOR_SIZE),
is(1));
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/auth/MySQLAuthenticationHandler.java
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/auth/MySQLAuthenticationHandler.java
index 511d430..476e891 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/auth/MySQLAuthenticationHandler.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/auth/MySQLAuthenticationHandler.java
@@ -46,19 +46,16 @@ public final class MySQLAuthenticationHandler {
* @param username username
* @param hostname hostname
* @param authResponse auth response
- * @param database database
+ * @param databaseName database name
* @return login success or failure
*/
- public Optional<MySQLServerErrorCode> login(final String username, final
String hostname, final byte[] authResponse, final String database) {
+ public Optional<MySQLServerErrorCode> login(final String username, final
String hostname, final byte[] authResponse, final String databaseName) {
Optional<ShardingSphereUser> user =
ProxyContext.getInstance().getMetaDataContexts().getAuthentication().findUser(new
Grantee(username, hostname));
if (!user.isPresent() || !isPasswordRight(user.get().getPassword(),
authResponse)) {
return Optional.of(MySQLServerErrorCode.ER_ACCESS_DENIED_ERROR);
}
- ShardingSpherePrivilege privilege =
ProxyContext.getInstance().getMetaDataContexts().getAuthentication().getAuthentication().get(user.get());
- if (null != privilege && privilege.hasPrivileges(database)) {
- return Optional.empty();
- }
- return Optional.of(MySQLServerErrorCode.ER_DBACCESS_DENIED_ERROR);
+ Optional<ShardingSpherePrivilege> privilege =
ProxyContext.getInstance().getMetaDataContexts().getAuthentication().findPrivilege(user.get().getGrantee());
+ return privilege.isPresent() &&
privilege.get().hasPrivileges(databaseName) ? Optional.empty() :
Optional.of(MySQLServerErrorCode.ER_DBACCESS_DENIED_ERROR);
}
private boolean isPasswordRight(final String password, final byte[]
authResponse) {
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/auth/PostgreSQLAuthenticationHandler.java
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/auth/PostgreSQLAuthenticationHandler.java
index 9def831..4c49cb5 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/auth/PostgreSQLAuthenticationHandler.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/auth/PostgreSQLAuthenticationHandler.java
@@ -23,6 +23,7 @@ import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import
org.apache.shardingsphere.db.protocol.postgresql.constant.PostgreSQLErrorCode;
import
org.apache.shardingsphere.db.protocol.postgresql.packet.handshake.PostgreSQLPasswordMessagePacket;
+import
org.apache.shardingsphere.infra.metadata.auth.model.privilege.ShardingSpherePrivilege;
import org.apache.shardingsphere.infra.metadata.auth.model.user.Grantee;
import
org.apache.shardingsphere.infra.metadata.auth.model.user.ShardingSphereUser;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
@@ -56,11 +57,11 @@ public final class PostgreSQLAuthenticationHandler {
if (!expectedMd5Digest.equals(md5Digest)) {
return new
PostgreSQLLoginResult(PostgreSQLErrorCode.INVALID_PASSWORD,
String.format("password authentication failed for user \"%s\"", username));
}
+ Optional<ShardingSpherePrivilege> privilege =
ProxyContext.getInstance().getMetaDataContexts().getAuthentication().findPrivilege(user.get().getGrantee());
// TODO : privilege.hasPrivileges(schema, xxx) (xxx means the
privileges needed here), rather than Collections.emptyList()
- if
(!ProxyContext.getInstance().getMetaDataContexts().getAuthentication().getAuthentication().get(user.get()).hasPrivileges(databaseName,
Collections.emptyList())) {
- return new
PostgreSQLLoginResult(PostgreSQLErrorCode.PRIVILEGE_NOT_GRANTED,
String.format("Access denied for user '%s' to database '%s'", username,
databaseName));
- }
- return new
PostgreSQLLoginResult(PostgreSQLErrorCode.SUCCESSFUL_COMPLETION, null);
+ return privilege.isPresent() &&
privilege.get().hasPrivileges(databaseName, Collections.emptyList())
+ ? new
PostgreSQLLoginResult(PostgreSQLErrorCode.SUCCESSFUL_COMPLETION, null)
+ : new
PostgreSQLLoginResult(PostgreSQLErrorCode.PRIVILEGE_NOT_GRANTED,
String.format("Access denied for user '%s' to database '%s'", username,
databaseName));
}
private static String md5Encode(final String username, final String
password, final byte[] md5Salt) {