This is an automated email from the ASF dual-hosted git repository.
wuweijie 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 c6c8eda Remove AuthorityContext and refactor SQLCheckEngine (#10032)
c6c8eda is described below
commit c6c8eda9fdca8d6c9af332ee4382189528758a89
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Apr 10 23:01:34 2021 +0800
Remove AuthorityContext and refactor SQLCheckEngine (#10032)
* Remove AuthorityContext
* Refactor SQLCheckEngine
---
.../shardingsphere/authority/AuthorityContext.java | 53 ---------------------
.../authority/checker/AuthorityChecker.java | 13 +++---
.../authority/rule/AuthorityRule.java | 8 ++--
.../authority/GovernanceAuthorityContext.java | 4 +-
.../shardingsphere/infra/check/SQLCheckEngine.java | 54 ++++++++++++++--------
.../shardingsphere/infra/check/SQLChecker.java | 6 ++-
.../statement/ShardingSpherePreparedStatement.java | 4 +-
.../core/statement/ShardingSphereStatement.java | 2 +-
.../text/TextProtocolBackendHandlerFactory.java | 2 +-
.../mysql/executor/ShowDatabasesExecutor.java | 5 +-
.../admin/mysql/executor/UseDatabaseExecutor.java | 5 +-
.../mysql/executor/ShowDatabasesExecutorTest.java | 10 ----
.../mysql/auth/MySQLAuthenticationHandler.java | 4 +-
.../admin/initdb/MySQLComInitDbExecutor.java | 5 +-
.../execute/MySQLComStmtExecuteExecutor.java | 2 +-
.../auth/PostgreSQLAuthenticationHandler.java | 4 +-
16 files changed, 71 insertions(+), 110 deletions(-)
diff --git
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/AuthorityContext.java
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/AuthorityContext.java
deleted file mode 100644
index d295ebb..0000000
---
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/AuthorityContext.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.shardingsphere.authority;
-
-import lombok.AccessLevel;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.authority.spi.AuthorityProvideAlgorithm;
-
-/**
- * Authority context.
- */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-@Getter
-public final class AuthorityContext {
-
- private static final AuthorityContext INSTANCE = new AuthorityContext();
-
- private volatile AuthorityProvideAlgorithm provider;
-
- /**
- * Get instance.
- *
- * @return instance
- */
- public static AuthorityContext getInstance() {
- return INSTANCE;
- }
-
- /**
- * Initial authority provide algorithm.
- *
- * @param provider authority provide algorithm
- */
- public synchronized void init(final AuthorityProvideAlgorithm provider) {
- this.provider = provider;
- }
-}
diff --git
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/checker/AuthorityChecker.java
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/checker/AuthorityChecker.java
index f940610..a5292fb 100644
---
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/checker/AuthorityChecker.java
+++
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/checker/AuthorityChecker.java
@@ -18,13 +18,12 @@
package org.apache.shardingsphere.authority.checker;
import org.apache.shardingsphere.authority.constant.AuthorityOrder;
+import org.apache.shardingsphere.authority.model.PrivilegeType;
+import org.apache.shardingsphere.authority.model.ShardingSpherePrivileges;
import org.apache.shardingsphere.authority.rule.AuthorityRule;
import org.apache.shardingsphere.infra.check.SQLCheckResult;
import org.apache.shardingsphere.infra.check.SQLChecker;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
-import org.apache.shardingsphere.authority.AuthorityContext;
-import org.apache.shardingsphere.authority.model.PrivilegeType;
-import org.apache.shardingsphere.authority.model.ShardingSpherePrivileges;
import org.apache.shardingsphere.infra.metadata.user.Grantee;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowDatabasesStatement;
@@ -39,19 +38,19 @@ import java.util.Optional;
public final class AuthorityChecker implements SQLChecker<AuthorityRule> {
@Override
- public boolean check(final String schemaName, final Grantee grantee) {
+ public boolean check(final String schemaName, final Grantee grantee, final
AuthorityRule authorityRule) {
if (null == grantee) {
return true;
}
- return
AuthorityContext.getInstance().getProvider().findPrivileges(grantee).map(optional
-> optional.hasPrivileges(schemaName)).orElse(false);
+ return
authorityRule.getAuthorityProvider().findPrivileges(grantee).map(optional ->
optional.hasPrivileges(schemaName)).orElse(false);
}
@Override
- public SQLCheckResult check(final SQLStatement sqlStatement, final
List<Object> parameters, final ShardingSphereMetaData metaData, final Grantee
grantee) {
+ public SQLCheckResult check(final SQLStatement sqlStatement, final
List<Object> parameters, final ShardingSphereMetaData metaData, final Grantee
grantee, final AuthorityRule authorityRule) {
if (null == grantee) {
return new SQLCheckResult(true, "");
}
- Optional<ShardingSpherePrivileges> privileges =
AuthorityContext.getInstance().getProvider().findPrivileges(grantee);
+ Optional<ShardingSpherePrivileges> privileges =
authorityRule.getAuthorityProvider().findPrivileges(grantee);
// TODO add error msg
return privileges.map(optional -> new
SQLCheckResult(optional.hasPrivileges(Collections.singletonList(getPrivilege(sqlStatement))),
"")).orElseGet(() -> new SQLCheckResult(false, ""));
}
diff --git
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/AuthorityRule.java
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/AuthorityRule.java
index 49ff750..f5a59e6 100644
---
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/AuthorityRule.java
+++
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/AuthorityRule.java
@@ -18,7 +18,6 @@
package org.apache.shardingsphere.authority.rule;
import lombok.Getter;
-import org.apache.shardingsphere.authority.AuthorityContext;
import
org.apache.shardingsphere.authority.api.config.AuthorityRuleConfiguration;
import org.apache.shardingsphere.authority.spi.AuthorityProvideAlgorithm;
import
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmFactory;
@@ -40,11 +39,10 @@ public final class AuthorityRule implements GlobalRule {
ShardingSphereServiceLoader.register(AuthorityProvideAlgorithm.class);
}
- private final AuthorityProvideAlgorithm provider;
+ private final AuthorityProvideAlgorithm authorityProvider;
public AuthorityRule(final AuthorityRuleConfiguration config, final
Map<String, ShardingSphereMetaData> mataDataMap, final
Collection<ShardingSphereUser> users) {
- provider =
ShardingSphereAlgorithmFactory.createAlgorithm(config.getProvider(),
AuthorityProvideAlgorithm.class);
- provider.init(mataDataMap, users);
- AuthorityContext.getInstance().init(provider);
+ authorityProvider =
ShardingSphereAlgorithmFactory.createAlgorithm(config.getProvider(),
AuthorityProvideAlgorithm.class);
+ authorityProvider.init(mataDataMap, users);
}
}
diff --git
a/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/authority/GovernanceAuthorityContext.java
b/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/authority/GovernanceAuthorityContext.java
index 2f949fd..93c370c 100644
---
a/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/authority/GovernanceAuthorityContext.java
+++
b/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/authority/GovernanceAuthorityContext.java
@@ -20,7 +20,6 @@ package
org.apache.shardingsphere.governance.context.authority;
import com.google.common.base.Preconditions;
import com.google.common.eventbus.Subscribe;
import lombok.Setter;
-import org.apache.shardingsphere.authority.AuthorityContext;
import org.apache.shardingsphere.authority.rule.AuthorityRule;
import org.apache.shardingsphere.authority.spi.AuthorityProvideAlgorithm;
import
org.apache.shardingsphere.governance.core.event.model.authority.AuthorityChangedEvent;
@@ -52,8 +51,7 @@ public final class GovernanceAuthorityContext implements
MetaDataAwareEventSubsc
private void reloadAuthority(final Collection<ShardingSphereUser> users) {
Optional<AuthorityRule> authorityRule =
metaDataContexts.getGlobalRuleMetaData().getRules().stream().filter(each ->
each instanceof AuthorityRule).findAny().map(each -> (AuthorityRule) each);
Preconditions.checkState(authorityRule.isPresent());
- AuthorityProvideAlgorithm provider = authorityRule.get().getProvider();
+ AuthorityProvideAlgorithm provider =
authorityRule.get().getAuthorityProvider();
provider.refresh(metaDataContexts.getMetaDataMap(), users);
- AuthorityContext.getInstance().init(provider);
}
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/check/SQLCheckEngine.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/check/SQLCheckEngine.java
index 0ad3d9c..2ed72c0 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/check/SQLCheckEngine.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/check/SQLCheckEngine.java
@@ -20,12 +20,17 @@ package org.apache.shardingsphere.infra.check;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import
org.apache.shardingsphere.infra.metadata.rule.ShardingSphereRuleMetaData;
import org.apache.shardingsphere.infra.metadata.user.Grantee;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
import org.apache.shardingsphere.infra.spi.ordered.OrderedSPIRegistry;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
+import java.util.Collection;
+import java.util.LinkedList;
import java.util.List;
+import java.util.Map.Entry;
/**
* SQL check engine.
@@ -38,37 +43,48 @@ public final class SQLCheckEngine {
}
/**
- * Check SQL.
- *
- * @param sqlStatement SQL statement
- * @param parameters SQL parameters
+ * Check schema.
+ *
+ * @param schemaName schema name
* @param metaData meta data
+ * @param globalRuleMetaData global rule meta data
* @param grantee grantee
+ * @return check result
*/
- public static void check(final SQLStatement sqlStatement, final
List<Object> parameters, final ShardingSphereMetaData metaData, final Grantee
grantee) {
- for (SQLChecker<?> each :
OrderedSPIRegistry.getRegisteredServices(metaData.getRuleMetaData().getRules(),
SQLChecker.class).values()) {
- SQLCheckResult checkResult = each.check(sqlStatement, parameters,
metaData, grantee);
- if (!checkResult.isPassed()) {
- throw new SQLCheckException(checkResult.getErrorMessage());
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ public static boolean check(final String schemaName, final
ShardingSphereMetaData metaData, final ShardingSphereRuleMetaData
globalRuleMetaData, final Grantee grantee) {
+ for (Entry<ShardingSphereRule, SQLChecker> entry :
OrderedSPIRegistry.getRegisteredServices(getRules(metaData,
globalRuleMetaData), SQLChecker.class).entrySet()) {
+ boolean checkResult = entry.getValue().check(schemaName, grantee,
entry.getKey());
+ if (!checkResult) {
+ return false;
}
}
+ return true;
}
/**
- * Check schema.
- *
- * @param schemaName schema name
+ * Check SQL.
+ *
+ * @param sqlStatement SQL statement
+ * @param parameters SQL parameters
* @param metaData meta data
+ * @param globalRuleMetaData global rule meta data
* @param grantee grantee
- * @return check result
*/
- public static boolean check(final String schemaName, final
ShardingSphereMetaData metaData, final Grantee grantee) {
- for (SQLChecker<?> each :
OrderedSPIRegistry.getRegisteredServices(metaData.getRuleMetaData().getRules(),
SQLChecker.class).values()) {
- boolean checkResult = each.check(schemaName, grantee);
- if (!checkResult) {
- return false;
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ public static void check(final SQLStatement sqlStatement, final
List<Object> parameters,
+ final ShardingSphereMetaData metaData, final
ShardingSphereRuleMetaData globalRuleMetaData, final Grantee grantee) {
+ for (Entry<ShardingSphereRule, SQLChecker> entry :
OrderedSPIRegistry.getRegisteredServices(getRules(metaData,
globalRuleMetaData), SQLChecker.class).entrySet()) {
+ SQLCheckResult checkResult = entry.getValue().check(sqlStatement,
parameters, metaData, grantee, entry.getKey());
+ if (!checkResult.isPassed()) {
+ throw new SQLCheckException(checkResult.getErrorMessage());
}
}
- return true;
+ }
+
+ private static Collection<ShardingSphereRule> getRules(final
ShardingSphereMetaData metaData, final ShardingSphereRuleMetaData
globalRuleMetaData) {
+ Collection<ShardingSphereRule> result = new
LinkedList<>(metaData.getRuleMetaData().getRules());
+ result.addAll(globalRuleMetaData.getRules());
+ return result;
}
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/check/SQLChecker.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/check/SQLChecker.java
index 31674ea..9f517b1 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/check/SQLChecker.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/check/SQLChecker.java
@@ -36,9 +36,10 @@ public interface SQLChecker<T extends ShardingSphereRule>
extends OrderedSPI<T>
*
* @param schemaName schema name
* @param grantee grantee
+ * @param rule rule
* @return check result
*/
- boolean check(String schemaName, Grantee grantee);
+ boolean check(String schemaName, Grantee grantee, T rule);
/**
* Check SQL.
@@ -47,7 +48,8 @@ public interface SQLChecker<T extends ShardingSphereRule>
extends OrderedSPI<T>
* @param parameters SQL parameters
* @param metaData meta data
* @param grantee grantee
+ * @param rule rule
* @return SQL check result
*/
- SQLCheckResult check(SQLStatement sqlStatement, List<Object> parameters,
ShardingSphereMetaData metaData, Grantee grantee);
+ SQLCheckResult check(SQLStatement sqlStatement, List<Object> parameters,
ShardingSphereMetaData metaData, Grantee grantee, T rule);
}
diff --git
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index 12e08b0..236d0e1 100644
---
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -358,7 +358,7 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
private ExecutionContext createExecutionContext() {
LogicSQL logicSQL = createLogicSQL();
-
SQLCheckEngine.check(logicSQL.getSqlStatementContext().getSqlStatement(),
logicSQL.getParameters(), metaDataContexts.getDefaultMetaData(), null);
+
SQLCheckEngine.check(logicSQL.getSqlStatementContext().getSqlStatement(),
logicSQL.getParameters(), metaDataContexts.getDefaultMetaData(),
metaDataContexts.getGlobalRuleMetaData(), null);
ExecutionContext result =
kernelProcessor.generateExecutionContext(logicSQL,
metaDataContexts.getDefaultMetaData(), metaDataContexts.getProps());
findGeneratedKey(result).ifPresent(generatedKey ->
generatedValues.addAll(generatedKey.getGeneratedValues()));
return result;
@@ -420,7 +420,7 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
}
@Override
- public void addBatch() throws SQLException {
+ public void addBatch() {
try {
executionContext = createExecutionContext();
batchPreparedStatementExecutor.addBatchForExecutionUnits(executionContext.getExecutionUnits());
diff --git
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
index 13e4a95..123111f 100644
---
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
+++
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
@@ -408,7 +408,7 @@ public final class ShardingSphereStatement extends
AbstractStatementAdapter {
private ExecutionContext createExecutionContext(final String sql) throws
SQLException {
clearStatements();
LogicSQL logicSQL = createLogicSQL(sql);
-
SQLCheckEngine.check(logicSQL.getSqlStatementContext().getSqlStatement(),
logicSQL.getParameters(), metaDataContexts.getDefaultMetaData(), null);
+
SQLCheckEngine.check(logicSQL.getSqlStatementContext().getSqlStatement(),
logicSQL.getParameters(), metaDataContexts.getDefaultMetaData(),
metaDataContexts.getGlobalRuleMetaData(), null);
return kernelProcessor.generateExecutionContext(logicSQL,
metaDataContexts.getDefaultMetaData(), metaDataContexts.getProps());
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
index 1748237..0f2ce97 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
@@ -91,7 +91,7 @@ public final class TextProtocolBackendHandlerFactory {
// TODO :Authority, need to refactor after GlobalRule is added
if (!Strings.isNullOrEmpty(backendConnection.getSchemaName())) {
MetaDataContexts contexts =
ProxyContext.getInstance().getMetaDataContexts();
- SQLCheckEngine.check(sqlStatement, Collections.emptyList(),
contexts.getMetaData(backendConnection.getSchemaName()),
backendConnection.getGrantee());
+ SQLCheckEngine.check(sqlStatement, Collections.emptyList(),
contexts.getMetaData(backendConnection.getSchemaName()),
contexts.getGlobalRuleMetaData(), backendConnection.getGrantee());
}
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutor.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutor.java
index 84689e7..e9c374b 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutor.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutor.java
@@ -52,13 +52,14 @@ public final class ShowDatabasesExecutor implements
DatabaseAdminQueryExecutor {
}
private Collection<Object> getSchemaNames(final BackendConnection
backendConnection) {
+ ShardingSphereRuleMetaData globalRuleMetaData =
ProxyContext.getInstance().getMetaDataContexts().getGlobalRuleMetaData();
try {
- SQLCheckEngine.check(new MySQLShowDatabasesStatement(),
Collections.emptyList(), getMetaData(), backendConnection.getGrantee());
+ SQLCheckEngine.check(new MySQLShowDatabasesStatement(),
Collections.emptyList(), getMetaData(), globalRuleMetaData,
backendConnection.getGrantee());
return new
ArrayList<>(ProxyContext.getInstance().getAllSchemaNames());
} catch (final SQLCheckException ex) {
Collection<Object> result = new LinkedList<>();
for (String each : ProxyContext.getInstance().getAllSchemaNames())
{
- if (SQLCheckEngine.check(each,
ProxyContext.getInstance().getMetaData(each), backendConnection.getGrantee())) {
+ if (SQLCheckEngine.check(each,
ProxyContext.getInstance().getMetaData(each), globalRuleMetaData,
backendConnection.getGrantee())) {
result.add(each);
}
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutor.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutor.java
index 162dab9..96308913 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutor.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutor.java
@@ -19,6 +19,7 @@ package
org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.check.SQLCheckEngine;
+import org.apache.shardingsphere.infra.context.metadata.MetaDataContexts;
import
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import
org.apache.shardingsphere.proxy.backend.exception.UnknownDatabaseException;
@@ -37,7 +38,9 @@ public final class UseDatabaseExecutor implements
DatabaseAdminExecutor {
@Override
public void execute(final BackendConnection backendConnection) {
String schema = SQLUtil.getExactlyValue(useStatement.getSchema());
- if (!ProxyContext.getInstance().schemaExists(schema) &&
SQLCheckEngine.check(schema,
ProxyContext.getInstance().getMetaDataContexts().getMetaData(schema),
backendConnection.getGrantee())) {
+ MetaDataContexts metaDataContexts =
ProxyContext.getInstance().getMetaDataContexts();
+ if (!ProxyContext.getInstance().schemaExists(schema)
+ && SQLCheckEngine.check(schema,
metaDataContexts.getMetaData(schema), metaDataContexts.getGlobalRuleMetaData(),
backendConnection.getGrantee())) {
throw new UnknownDatabaseException(schema);
}
backendConnection.setCurrentSchema(schema);
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutorTest.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutorTest.java
index f1c3efb..50a6a27 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutorTest.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutorTest.java
@@ -17,9 +17,6 @@
package org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor;
-import org.apache.shardingsphere.authority.AuthorityContext;
-import
org.apache.shardingsphere.authority.provider.natived.NativeAuthorityProviderAlgorithm;
-import org.apache.shardingsphere.authority.spi.AuthorityProvideAlgorithm;
import
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
import
org.apache.shardingsphere.infra.context.metadata.impl.StandardMetaDataContexts;
import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
@@ -61,17 +58,10 @@ public final class ShowDatabasesExecutorTest {
showDatabasesExecutor = new ShowDatabasesExecutor();
Field metaDataContexts =
ProxyContext.getInstance().getClass().getDeclaredField("metaDataContexts");
metaDataContexts.setAccessible(true);
- initAuthorityProvider();
metaDataContexts.set(ProxyContext.getInstance(), new
StandardMetaDataContexts(getMetaDataMap(),
mock(ShardingSphereRuleMetaData.class),
mock(ExecutorEngine.class), new
ShardingSphereUsers(Collections.singleton(new ShardingSphereUser("root",
"root", ""))), new ConfigurationProperties(new Properties())));
}
- private void initAuthorityProvider() {
- AuthorityProvideAlgorithm algorithm = new
NativeAuthorityProviderAlgorithm();
- algorithm.init(Collections.emptyMap(), Collections.emptyList());
- AuthorityContext.getInstance().init(algorithm);
- }
-
private Map<String, ShardingSphereMetaData> getMetaDataMap() {
Map<String, ShardingSphereMetaData> result = new LinkedHashMap<>(10,
1);
for (int i = 0; i < 10; i++) {
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 55da736..aa3b650 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
@@ -23,6 +23,7 @@ import org.apache.commons.codec.digest.DigestUtils;
import
org.apache.shardingsphere.db.protocol.mysql.constant.MySQLServerErrorCode;
import
org.apache.shardingsphere.db.protocol.mysql.packet.handshake.MySQLAuthPluginData;
import org.apache.shardingsphere.infra.check.SQLCheckEngine;
+import org.apache.shardingsphere.infra.context.metadata.MetaDataContexts;
import org.apache.shardingsphere.infra.metadata.user.Grantee;
import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
@@ -54,7 +55,8 @@ public final class MySQLAuthenticationHandler {
if (!user.isPresent() || !isPasswordRight(user.get().getPassword(),
authResponse)) {
return Optional.of(MySQLServerErrorCode.ER_ACCESS_DENIED_ERROR);
}
- return null == databaseName || SQLCheckEngine.check(databaseName,
ProxyContext.getInstance().getMetaDataContexts().getMetaData(databaseName),
user.get().getGrantee())
+ MetaDataContexts metaDataContexts =
ProxyContext.getInstance().getMetaDataContexts();
+ return null == databaseName || SQLCheckEngine.check(databaseName,
metaDataContexts.getMetaData(databaseName),
metaDataContexts.getGlobalRuleMetaData(), user.get().getGrantee())
? Optional.empty() :
Optional.of(MySQLServerErrorCode.ER_DBACCESS_DENIED_ERROR);
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/admin/initdb/MySQLComInitDbExecutor.java
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/admin/initdb/MySQLComInitDbExecutor.java
index e5e5f08..1ba4000 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/admin/initdb/MySQLComInitDbExecutor.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/admin/initdb/MySQLComInitDbExecutor.java
@@ -22,6 +22,7 @@ import
org.apache.shardingsphere.db.protocol.mysql.packet.command.admin.initdb.M
import
org.apache.shardingsphere.db.protocol.mysql.packet.generic.MySQLOKPacket;
import org.apache.shardingsphere.db.protocol.packet.DatabasePacket;
import org.apache.shardingsphere.infra.check.SQLCheckEngine;
+import org.apache.shardingsphere.infra.context.metadata.MetaDataContexts;
import
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import
org.apache.shardingsphere.proxy.backend.exception.UnknownDatabaseException;
@@ -44,7 +45,9 @@ public final class MySQLComInitDbExecutor implements
CommandExecutor {
@Override
public Collection<DatabasePacket<?>> execute() {
String schema = SQLUtil.getExactlyValue(packet.getSchema());
- if (ProxyContext.getInstance().schemaExists(schema) &&
SQLCheckEngine.check(schema,
ProxyContext.getInstance().getMetaDataContexts().getMetaData(schema),
backendConnection.getGrantee())) {
+ MetaDataContexts metaDataContexts =
ProxyContext.getInstance().getMetaDataContexts();
+ if (ProxyContext.getInstance().schemaExists(schema)
+ && SQLCheckEngine.check(schema,
metaDataContexts.getMetaData(schema), metaDataContexts.getGlobalRuleMetaData(),
backendConnection.getGrantee())) {
backendConnection.setCurrentSchema(packet.getSchema());
return Collections.singletonList(new MySQLOKPacket(1));
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
index c1828f5..c403c31 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
@@ -70,7 +70,7 @@ public final class MySQLComStmtExecuteExecutor implements
QueryCommandExecutor {
private static void sqlCheck(final BackendConnection backendConnection,
final SQLStatement sqlStatement) {
MetaDataContexts contexts =
ProxyContext.getInstance().getMetaDataContexts();
- SQLCheckEngine.check(sqlStatement, Collections.emptyList(),
contexts.getMetaData(backendConnection.getSchemaName()),
backendConnection.getGrantee());
+ SQLCheckEngine.check(sqlStatement, Collections.emptyList(),
contexts.getMetaData(backendConnection.getSchemaName()),
contexts.getGlobalRuleMetaData(), backendConnection.getGrantee());
}
@Override
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 6a7563c..a893964 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
@@ -24,6 +24,7 @@ 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.check.SQLCheckEngine;
+import org.apache.shardingsphere.infra.context.metadata.MetaDataContexts;
import org.apache.shardingsphere.infra.metadata.user.Grantee;
import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
@@ -56,7 +57,8 @@ public final class PostgreSQLAuthenticationHandler {
if (!expectedMd5Digest.equals(md5Digest)) {
return new
PostgreSQLLoginResult(PostgreSQLErrorCode.INVALID_PASSWORD,
String.format("password authentication failed for user \"%s\"", username));
}
- return null == databaseName || SQLCheckEngine.check(databaseName,
ProxyContext.getInstance().getMetaDataContexts().getMetaData(databaseName),
user.get().getGrantee())
+ MetaDataContexts metaDataContexts =
ProxyContext.getInstance().getMetaDataContexts();
+ return null == databaseName || SQLCheckEngine.check(databaseName,
metaDataContexts.getMetaData(databaseName),
metaDataContexts.getGlobalRuleMetaData(), user.get().getGrantee())
? new
PostgreSQLLoginResult(PostgreSQLErrorCode.SUCCESSFUL_COMPLETION, null)
: new
PostgreSQLLoginResult(PostgreSQLErrorCode.PRIVILEGE_NOT_GRANTED,
String.format("Access denied for user '%s' to database '%s'", username,
databaseName));
}