This is an automated email from the ASF dual-hosted git repository.

zhonghongsheng 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 1b1a59ff48d Move ConnectionSession.grantee into ConnectionContext 
(#31706)
1b1a59ff48d is described below

commit 1b1a59ff48ddbc44bfd079e2b414b088adf21565
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Jun 15 14:58:50 2024 +0800

    Move ConnectionSession.grantee into ConnectionContext (#31706)
    
    * Move ConnectionSession.grantee into ConnectionContext
    
    * Move ConnectionSession.grantee into ConnectionContext
    
    * Move ConnectionSession.grantee into ConnectionContext
---
 .../unicast/ShardingUnicastRoutingEngineTest.java  |  3 ++-
 .../session/connection/ConnectionContext.java      |  9 ++++++-
 .../DriverDatabaseConnectionManager.java           |  5 ++--
 .../core/connection/ShardingSphereConnection.java  |  2 +-
 .../DriverDatabaseConnectionManagerTest.java       |  3 ++-
 .../authority/checker/AuthorityChecker.java        |  3 ++-
 .../enumerable/EnumerableScanExecutor.java         |  3 ++-
 .../proxy/backend/connector/ProxySQLExecutor.java  |  4 +--
 .../handler/ProxyBackendHandlerFactory.java        |  2 +-
 .../executor/AbstractDatabaseMetaDataExecutor.java |  2 +-
 .../data/impl/UnicastDatabaseBackendHandler.java   |  2 +-
 .../database/DropDatabaseBackendHandler.java       |  2 +-
 .../proxy/backend/session/ConnectionSession.java   | 29 +++++++++++++++++-----
 .../handler/ProxyBackendHandlerFactoryTest.java    |  2 +-
 .../DefaultDatabaseMetaDataExecutorTest.java       |  5 ++--
 .../DatabaseOperateBackendHandlerFactoryTest.java  |  2 +-
 .../database/DropDatabaseBackendHandlerTest.java   |  4 ++-
 .../backend/session/ConnectionSessionTest.java     |  2 ++
 .../admin/executor/ShowCurrentUserExecutor.java    |  2 +-
 .../admin/executor/ShowDatabasesExecutor.java      |  2 +-
 .../admin/executor/UseDatabaseExecutor.java        |  2 +-
 .../SelectInformationSchemataExecutor.java         |  3 ++-
 .../executor/ShowCurrentUserExecutorTest.java      |  4 +--
 .../admin/executor/ShowDatabasesExecutorTest.java  |  4 +--
 .../admin/executor/UseDatabaseExecutorTest.java    |  3 ++-
 .../SelectInformationSchemataExecutorTest.java     |  5 ++--
 .../frontend/command/CommandExecutorTask.java      |  2 +-
 .../netty/FrontendChannelInboundHandler.java       |  9 ++++---
 .../netty/FrontendChannelInboundHandlerTest.java   |  2 +-
 .../admin/initdb/MySQLComInitDbExecutor.java       |  2 +-
 .../text/query/MySQLMultiStatementsHandler.java    |  2 +-
 .../PostgreSQLBatchedStatementsExecutor.java       |  2 +-
 32 files changed, 83 insertions(+), 45 deletions(-)

diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/unicast/ShardingUnicastRoutingEngineTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/unicast/ShardingUnicastRoutingEngineTest.java
index 18744574c61..c972a815d8b 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/unicast/ShardingUnicastRoutingEngineTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/unicast/ShardingUnicastRoutingEngineTest.java
@@ -22,6 +22,7 @@ import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementCont
 import 
org.apache.shardingsphere.infra.binder.context.statement.ddl.CursorStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import org.apache.shardingsphere.infra.metadata.user.Grantee;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
 import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
@@ -93,7 +94,7 @@ class ShardingUnicastRoutingEngineTest {
     
     @Test
     void assertRoutingForBroadcastTableWithPreferredDataSource() {
-        ConnectionContext connectionContext = new ConnectionContext(() -> 
Collections.singleton("ds_1"));
+        ConnectionContext connectionContext = new ConnectionContext(() -> 
Collections.singleton("ds_1"), new Grantee("", ""));
         RouteContext actual = new 
ShardingUnicastRoutingEngine(mock(SelectStatementContext.class), 
Collections.singleton("t_config"), connectionContext).route(shardingRule);
         assertThat(actual.getRouteUnits().size(), is(1));
         
assertThat(actual.getRouteUnits().iterator().next().getDataSourceMapper().getActualName(),
 is("ds_1"));
diff --git 
a/infra/session/src/main/java/org/apache/shardingsphere/infra/session/connection/ConnectionContext.java
 
b/infra/session/src/main/java/org/apache/shardingsphere/infra/session/connection/ConnectionContext.java
index a35ecb42776..c2539c8fe33 100644
--- 
a/infra/session/src/main/java/org/apache/shardingsphere/infra/session/connection/ConnectionContext.java
+++ 
b/infra/session/src/main/java/org/apache/shardingsphere/infra/session/connection/ConnectionContext.java
@@ -21,6 +21,7 @@ import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.Setter;
+import org.apache.shardingsphere.infra.metadata.user.Grantee;
 import 
org.apache.shardingsphere.infra.session.connection.cursor.CursorConnectionContext;
 import 
org.apache.shardingsphere.infra.session.connection.datasource.UsedDataSourceProvider;
 import 
org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext;
@@ -44,13 +45,19 @@ public final class ConnectionContext implements 
AutoCloseable {
     @Getter(AccessLevel.NONE)
     private final UsedDataSourceProvider usedDataSourceProvider;
     
+    private final Grantee grantee;
+    
     private String databaseName;
     
     @Setter
     private String trafficInstanceId;
     
     public ConnectionContext() {
-        this(Collections::emptySet);
+        this(new Grantee("", ""));
+    }
+    
+    public ConnectionContext(final Grantee grantee) {
+        this(Collections::emptySet, grantee);
     }
     
     /**
diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/DriverDatabaseConnectionManager.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/DriverDatabaseConnectionManager.java
index 82a6519c680..1ef2174e108 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/DriverDatabaseConnectionManager.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/DriverDatabaseConnectionManager.java
@@ -35,6 +35,7 @@ import 
org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData;
 import org.apache.shardingsphere.infra.instance.metadata.InstanceType;
 import 
org.apache.shardingsphere.infra.instance.metadata.proxy.ProxyInstanceMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
+import org.apache.shardingsphere.infra.metadata.user.Grantee;
 import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser;
 import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
 import 
org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext;
@@ -83,10 +84,10 @@ public final class DriverDatabaseConnectionManager 
implements OnlineDatabaseConn
     
     private final ForceExecuteTemplate<Connection> forceExecuteTemplate = new 
ForceExecuteTemplate<>();
     
-    public DriverDatabaseConnectionManager(final String databaseName, final 
ContextManager contextManager) {
+    public DriverDatabaseConnectionManager(final String databaseName, final 
ContextManager contextManager, final Grantee grantee) {
         this.contextManager = contextManager;
         this.databaseName = databaseName;
-        connectionContext = new ConnectionContext(cachedConnections::keySet);
+        connectionContext = new ConnectionContext(cachedConnections::keySet, 
grantee);
         connectionContext.setCurrentDatabase(databaseName);
         physicalDataSourceMap = getPhysicalDataSourceMap(databaseName, 
contextManager);
         trafficDataSourceMap = getTrafficDataSourceMap(databaseName, 
contextManager);
diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ShardingSphereConnection.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ShardingSphereConnection.java
index db2024bae85..cf9be12ad83 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ShardingSphereConnection.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ShardingSphereConnection.java
@@ -85,7 +85,7 @@ public final class ShardingSphereConnection extends 
AbstractConnectionAdapter {
     public ShardingSphereConnection(final String databaseName, final 
ContextManager contextManager) {
         this.databaseName = databaseName;
         this.contextManager = contextManager;
-        databaseConnectionManager = new 
DriverDatabaseConnectionManager(databaseName, contextManager);
+        databaseConnectionManager = new 
DriverDatabaseConnectionManager(databaseName, contextManager, new Grantee("", 
""));
         processId = processEngine.connect(new Grantee("", ""), databaseName);
     }
     
diff --git 
a/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/core/connection/DriverDatabaseConnectionManagerTest.java
 
b/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/core/connection/DriverDatabaseConnectionManagerTest.java
index 9391da3a394..a4a15f05c34 100644
--- 
a/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/core/connection/DriverDatabaseConnectionManagerTest.java
+++ 
b/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/core/connection/DriverDatabaseConnectionManagerTest.java
@@ -27,6 +27,7 @@ import 
org.apache.shardingsphere.infra.instance.metadata.InstanceType;
 import 
org.apache.shardingsphere.infra.instance.metadata.proxy.ProxyInstanceMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import org.apache.shardingsphere.infra.metadata.user.Grantee;
 import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource;
@@ -70,7 +71,7 @@ class DriverDatabaseConnectionManagerTest {
     
     @BeforeEach
     void setUp() throws SQLException {
-        databaseConnectionManager = new 
DriverDatabaseConnectionManager(DefaultDatabase.LOGIC_NAME, 
mockContextManager());
+        databaseConnectionManager = new 
DriverDatabaseConnectionManager(DefaultDatabase.LOGIC_NAME, 
mockContextManager(), new Grantee("", "'"));
     }
     
     private ContextManager mockContextManager() throws SQLException {
diff --git 
a/kernel/authority/core/src/main/java/org/apache/shardingsphere/authority/checker/AuthorityChecker.java
 
b/kernel/authority/core/src/main/java/org/apache/shardingsphere/authority/checker/AuthorityChecker.java
index 7e1bd6abd6c..51d2d13a1e4 100644
--- 
a/kernel/authority/core/src/main/java/org/apache/shardingsphere/authority/checker/AuthorityChecker.java
+++ 
b/kernel/authority/core/src/main/java/org/apache/shardingsphere/authority/checker/AuthorityChecker.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.authority.checker;
 
+import com.google.common.base.Strings;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.authority.rule.AuthorityRule;
 import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
@@ -41,7 +42,7 @@ public final class AuthorityChecker {
      */
     @HighFrequencyInvocation
     public boolean isAuthorized(final String database) {
-        return null == grantee || 
rule.findUser(grantee).map(ShardingSphereUser::isAdmin).orElse(false)
+        return null == grantee || Strings.isNullOrEmpty(grantee.getUsername()) 
|| rule.findUser(grantee).map(ShardingSphereUser::isAdmin).orElse(false)
                 || rule.findPrivileges(grantee).map(optional -> 
optional.hasPrivileges(database)).orElse(false);
     }
 }
diff --git 
a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java
 
b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java
index f0921d47722..ee3892c3afd 100644
--- 
a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java
+++ 
b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java
@@ -114,7 +114,8 @@ public final class EnumerableScanExecutor implements 
ScanExecutor {
         }
         QueryContext queryContext = 
createQueryContext(federationContext.getMetaData(), scanContext, databaseType, 
federationContext.getQueryContext().isUseCache());
         ShardingSphereDatabase database = 
federationContext.getMetaData().getDatabase(databaseName);
-        ExecutionContext executionContext = new 
KernelProcessor().generateExecutionContext(queryContext, database, 
globalRuleMetaData, executorContext.getProps(), new ConnectionContext());
+        ExecutionContext executionContext = new 
KernelProcessor().generateExecutionContext(
+                queryContext, database, globalRuleMetaData, 
executorContext.getProps(), new ConnectionContext());
         if (federationContext.isPreview()) {
             
federationContext.getPreviewExecutionUnits().addAll(executionContext.getExecutionUnits());
             return createEmptyEnumerable();
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutor.java
index eec351266e4..441ce16663d 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutor.java
@@ -201,7 +201,7 @@ public final class ProxySQLExecutor {
         try {
             executionGroupContext = 
prepareEngine.prepare(executionContext.getRouteContext(), 
executionContext.getExecutionUnits(),
                     new 
ExecutionGroupReportContext(databaseConnectionManager.getConnectionSession().getProcessId(),
-                            
databaseConnectionManager.getConnectionSession().getDatabaseName(), 
databaseConnectionManager.getConnectionSession().getGrantee()));
+                            
databaseConnectionManager.getConnectionSession().getDatabaseName(), 
databaseConnectionManager.getConnectionSession().getConnectionContext().getGrantee()));
         } catch (final SQLException ex) {
             return getSaneExecuteResults(executionContext, ex);
         }
@@ -219,7 +219,7 @@ public final class ProxySQLExecutor {
         try {
             executionGroupContext = 
prepareEngine.prepare(executionContext.getRouteContext(), 
executionContext.getExecutionUnits(),
                     new 
ExecutionGroupReportContext(databaseConnectionManager.getConnectionSession().getProcessId(),
-                            
databaseConnectionManager.getConnectionSession().getDatabaseName(), 
databaseConnectionManager.getConnectionSession().getGrantee()));
+                            
databaseConnectionManager.getConnectionSession().getDatabaseName(), 
databaseConnectionManager.getConnectionSession().getConnectionContext().getGrantee()));
         } catch (final SQLException ex) {
             return getSaneExecuteResults(executionContext, ex);
         }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
index bb67afa958a..d145acf8e36 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
@@ -146,7 +146,7 @@ public final class ProxyBackendHandlerFactory {
         }
         AuthorityRule authorityRule = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(AuthorityRule.class);
         ShardingSphereDatabase database = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabase(databaseName);
-        ShardingSpherePreconditions.checkState(new 
AuthorityChecker(authorityRule, 
connectionSession.getGrantee()).isAuthorized(databaseName),
+        ShardingSpherePreconditions.checkState(new 
AuthorityChecker(authorityRule, 
connectionSession.getConnectionContext().getGrantee()).isAuthorized(databaseName),
                 () -> new UnknownDatabaseException(databaseName));
         SQLAuditEngine.audit(queryContext, 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData(),
 database);
         backendHandler = 
DatabaseAdminBackendHandlerFactory.newInstance(databaseType, 
sqlStatementContext, connectionSession);
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
index 6cc9f9b34e4..23e8fe10f22 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
@@ -144,7 +144,7 @@ public abstract class AbstractDatabaseMetaDataExecutor 
implements DatabaseAdminQ
         
         @Override
         protected Collection<String> getDatabaseNames(final ConnectionSession 
connectionSession) {
-            Optional<String> database = 
ProxyContext.getInstance().getAllDatabaseNames().stream().filter(each -> 
isAuthorized(each, connectionSession.getGrantee()))
+            Optional<String> database = 
ProxyContext.getInstance().getAllDatabaseNames().stream().filter(each -> 
isAuthorized(each, connectionSession.getConnectionContext().getGrantee()))
                     
.filter(AbstractDatabaseMetaDataExecutor::hasDataSource).findFirst();
             return 
database.map(Collections::singletonList).orElse(Collections.emptyList());
         }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/impl/UnicastDatabaseBackendHandler.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/impl/UnicastDatabaseBackendHandler.java
index 09b9e154e2f..792b2f08de5 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/impl/UnicastDatabaseBackendHandler.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/impl/UnicastDatabaseBackendHandler.java
@@ -72,7 +72,7 @@ public final class UnicastDatabaseBackendHandler implements 
DatabaseBackendHandl
             throw new NoDatabaseSelectedException();
         }
         AuthorityRule authorityRule = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(AuthorityRule.class);
-        Optional<ShardingSpherePrivileges> privileges = 
authorityRule.findPrivileges(connectionSession.getGrantee());
+        Optional<ShardingSpherePrivileges> privileges = 
authorityRule.findPrivileges(connectionSession.getConnectionContext().getGrantee());
         Stream<String> databaseStream = databaseNames.stream().filter(each -> 
ProxyContext.getInstance().getContextManager().getDatabase(each).containsDataSource());
         Optional<String> result = privileges.map(optional -> 
databaseStream.filter(optional::hasPrivileges).findFirst()).orElseGet(databaseStream::findFirst);
         ShardingSpherePreconditions.checkState(result.isPresent(), 
EmptyStorageUnitException::new);
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/database/DropDatabaseBackendHandler.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/database/DropDatabaseBackendHandler.java
index a58e748d81c..d89359a8f15 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/database/DropDatabaseBackendHandler.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/database/DropDatabaseBackendHandler.java
@@ -46,7 +46,7 @@ public final class DropDatabaseBackendHandler implements 
ProxyBackendHandler {
     
     @Override
     public ResponseHeader execute() {
-        check(sqlStatement, connectionSession.getGrantee());
+        check(sqlStatement, 
connectionSession.getConnectionContext().getGrantee());
         if (isDropCurrentDatabase(sqlStatement.getDatabaseName())) {
             checkSupportedDropCurrentDatabase(connectionSession);
             connectionSession.setCurrentDatabase(null);
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSession.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSession.java
index 1273c9aee70..95696d19f03 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSession.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSession.java
@@ -21,16 +21,18 @@ import io.netty.util.AttributeMap;
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
-import org.apache.shardingsphere.infra.session.query.QueryContext;
-import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.ExecutorStatementManager;
 import org.apache.shardingsphere.infra.metadata.user.Grantee;
+import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
+import org.apache.shardingsphere.infra.session.query.QueryContext;
 import 
org.apache.shardingsphere.proxy.backend.connector.ProxyDatabaseConnectionManager;
 import 
org.apache.shardingsphere.proxy.backend.connector.jdbc.statement.JDBCBackendStatement;
 import 
org.apache.shardingsphere.proxy.backend.session.transaction.TransactionStatus;
 import 
org.apache.shardingsphere.sql.parser.sql.common.enums.TransactionIsolationLevel;
 
+import java.util.concurrent.atomic.AtomicReference;
+
 /**
  * Connection session.
  */
@@ -45,8 +47,6 @@ public final class ConnectionSession {
     
     private volatile int connectionId;
     
-    private Grantee grantee;
-    
     private final TransactionStatus transactionStatus;
     
     private final AttributeMap attributeMap;
@@ -66,7 +66,7 @@ public final class ConnectionSession {
     
     private final ServerPreparedStatementRegistry 
serverPreparedStatementRegistry = new ServerPreparedStatementRegistry();
     
-    private final ConnectionContext connectionContext;
+    private final AtomicReference<ConnectionContext> connectionContext = new 
AtomicReference<>();
     
     private final RequiredSessionVariableRecorder 
requiredSessionVariableRecorder = new RequiredSessionVariableRecorder();
     
@@ -80,7 +80,15 @@ public final class ConnectionSession {
         this.attributeMap = attributeMap;
         databaseConnectionManager = new ProxyDatabaseConnectionManager(this);
         statementManager = new JDBCBackendStatement();
-        connectionContext = new 
ConnectionContext(databaseConnectionManager::getUsedDataSourceNames);
+    }
+    
+    /**
+     * Set grantee.
+     *
+     * @param grantee grantee
+     */
+    public void setGrantee(final Grantee grantee) {
+        connectionContext.set(new 
ConnectionContext(databaseConnectionManager::getUsedDataSourceNames, grantee));
     }
     
     /**
@@ -94,6 +102,15 @@ public final class ConnectionSession {
         }
     }
     
+    /**
+     * Get connection context.
+     *
+     * @return connection context
+     */
+    public ConnectionContext getConnectionContext() {
+        return connectionContext.get();
+    }
+    
     /**
      * Get database name.
      *
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactoryTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactoryTest.java
index 3f95926d9d4..641268e44ef 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactoryTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactoryTest.java
@@ -90,7 +90,7 @@ class ProxyBackendHandlerFactoryTest {
     
     @BeforeEach
     void setUp() {
-        when(connectionSession.getGrantee()).thenReturn(new 
Grantee(DefaultUser.USERNAME, "%"));
+        
when(connectionSession.getConnectionContext().getGrantee()).thenReturn(new 
Grantee(DefaultUser.USERNAME, "%"));
         when(connectionSession.getDefaultDatabaseName()).thenReturn("db");
         when(connectionSession.getDatabaseName()).thenReturn("db");
         ProxyDatabaseConnectionManager databaseConnectionManager = 
mock(ProxyDatabaseConnectionManager.class);
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DefaultDatabaseMetaDataExecutorTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DefaultDatabaseMetaDataExecutorTest.java
index 5cdb9c92b9d..1a043115709 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DefaultDatabaseMetaDataExecutorTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DefaultDatabaseMetaDataExecutorTest.java
@@ -41,6 +41,7 @@ import org.apache.shardingsphere.test.mock.StaticMockSettings;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Answers;
 import org.mockito.Mock;
 
 import java.sql.Connection;
@@ -67,12 +68,12 @@ class DefaultDatabaseMetaDataExecutorTest {
     
     private final Grantee grantee = new Grantee("root", "127.0.0.1");
     
-    @Mock
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private ConnectionSession connectionSession;
     
     @BeforeEach
     void setUp() {
-        when(connectionSession.getGrantee()).thenReturn(grantee);
+        
when(connectionSession.getConnectionContext().getGrantee()).thenReturn(grantee);
     }
     
     @Test
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/database/DatabaseOperateBackendHandlerFactoryTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/database/DatabaseOperateBackendHandlerFactoryTest.java
index 44e15ea89d8..fd6e47cda0f 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/database/DatabaseOperateBackendHandlerFactoryTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/database/DatabaseOperateBackendHandlerFactoryTest.java
@@ -74,7 +74,7 @@ class DatabaseOperateBackendHandlerFactoryTest {
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private ContextManager contextManager;
     
-    @Mock
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private ConnectionSession connectionSession;
     
     @BeforeEach
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/database/DropDatabaseBackendHandlerTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/database/DropDatabaseBackendHandlerTest.java
index afbed046204..c45e96d73c0 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/database/DropDatabaseBackendHandlerTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/database/DropDatabaseBackendHandlerTest.java
@@ -35,6 +35,7 @@ import org.apache.shardingsphere.test.mock.StaticMockSettings;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoSettings;
 import org.mockito.quality.Strictness;
@@ -58,7 +59,7 @@ import static org.mockito.Mockito.when;
 @MockitoSettings(strictness = Strictness.LENIENT)
 class DropDatabaseBackendHandlerTest {
     
-    @Mock
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private ConnectionSession connectionSession;
     
     @Mock
@@ -72,6 +73,7 @@ class DropDatabaseBackendHandlerTest {
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
         
when(ProxyContext.getInstance().databaseExists("foo_db")).thenReturn(true);
         
when(ProxyContext.getInstance().databaseExists("bar_db")).thenReturn(true);
+        
when(connectionSession.getConnectionContext().getGrantee()).thenReturn(null);
         handler = new DropDatabaseBackendHandler(sqlStatement, 
connectionSession);
     }
     
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSessionTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSessionTest.java
index a1fbc0a0eef..6f48236847b 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSessionTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSessionTest.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.proxy.backend.session;
 
 import org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import org.apache.shardingsphere.infra.metadata.user.Grantee;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import 
org.apache.shardingsphere.proxy.backend.connector.ProxyDatabaseConnectionManager;
@@ -59,6 +60,7 @@ class ConnectionSessionTest {
     @BeforeEach
     void setup() {
         connectionSession = new 
ConnectionSession(mock(MySQLDatabaseType.class), null);
+        connectionSession.setGrantee(new Grantee("", ""));
         
when(databaseConnectionManager.getConnectionSession()).thenReturn(connectionSession);
     }
     
diff --git 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowCurrentUserExecutor.java
 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowCurrentUserExecutor.java
index 2d0772ea877..d88984dad2a 100644
--- 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowCurrentUserExecutor.java
+++ 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowCurrentUserExecutor.java
@@ -50,7 +50,7 @@ public final class ShowCurrentUserExecutor implements 
DatabaseAdminQueryExecutor
     @Override
     public void execute(final ConnectionSession connectionSession) {
         AuthorityRule authorityRule = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(AuthorityRule.class);
-        Optional<Grantee> grantee = 
authorityRule.findUser(connectionSession.getGrantee()).map(ShardingSphereUser::getGrantee);
+        Optional<Grantee> grantee = 
authorityRule.findUser(connectionSession.getConnectionContext().getGrantee()).map(ShardingSphereUser::getGrantee);
         mergedResult = new LocalDataMergedResult(Collections.singleton(new 
LocalDataQueryResultRow(grantee.isPresent() ? grantee.get().toString() : "")));
     }
     
diff --git 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowDatabasesExecutor.java
 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowDatabasesExecutor.java
index 995f73235f0..becb0d9b0bb 100644
--- 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowDatabasesExecutor.java
+++ 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowDatabasesExecutor.java
@@ -57,7 +57,7 @@ public final class ShowDatabasesExecutor implements 
DatabaseAdminQueryExecutor {
     
     private Collection<LocalDataQueryResultRow> getDatabaseNames(final 
ConnectionSession connectionSession) {
         AuthorityRule authorityRule = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(AuthorityRule.class);
-        AuthorityChecker authorityChecker = new 
AuthorityChecker(authorityRule, connectionSession.getGrantee());
+        AuthorityChecker authorityChecker = new 
AuthorityChecker(authorityRule, 
connectionSession.getConnectionContext().getGrantee());
         return 
ProxyContext.getInstance().getAllDatabaseNames().stream().sorted()
                 .filter(each -> checkLikePattern(each) && 
authorityChecker.isAuthorized(each)).map(LocalDataQueryResultRow::new).collect(Collectors.toList());
     }
diff --git 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/UseDatabaseExecutor.java
 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/UseDatabaseExecutor.java
index dcf9f5e4a9f..307fb4baa58 100644
--- 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/UseDatabaseExecutor.java
+++ 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/UseDatabaseExecutor.java
@@ -40,7 +40,7 @@ public final class UseDatabaseExecutor implements 
DatabaseAdminExecutor {
     public void execute(final ConnectionSession connectionSession) {
         String databaseName = 
SQLUtils.getExactlyValue(useStatement.getSchema());
         AuthorityRule authorityRule = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(AuthorityRule.class);
-        AuthorityChecker authorityChecker = new 
AuthorityChecker(authorityRule, connectionSession.getGrantee());
+        AuthorityChecker authorityChecker = new 
AuthorityChecker(authorityRule, 
connectionSession.getConnectionContext().getGrantee());
         
ShardingSpherePreconditions.checkState(ProxyContext.getInstance().databaseExists(databaseName)
 && authorityChecker.isAuthorized(databaseName),
                 () -> new UnknownDatabaseException(databaseName));
         connectionSession.setCurrentDatabase(databaseName);
diff --git 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutor.java
 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutor.java
index 2a1977247b2..a0de7ba82b4 100644
--- 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutor.java
+++ 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutor.java
@@ -83,7 +83,8 @@ public final class SelectInformationSchemataExecutor extends 
DefaultDatabaseMeta
     
     @Override
     protected Collection<String> getDatabaseNames(final ConnectionSession 
connectionSession) {
-        Collection<String> databaseNames = 
ProxyContext.getInstance().getAllDatabaseNames().stream().filter(each -> 
isAuthorized(each, 
connectionSession.getGrantee())).collect(Collectors.toList());
+        Collection<String> databaseNames = 
ProxyContext.getInstance().getAllDatabaseNames().stream()
+                .filter(each -> isAuthorized(each, 
connectionSession.getConnectionContext().getGrantee())).collect(Collectors.toList());
         SCHEMA_WITHOUT_DATA_SOURCE.addAll(databaseNames.stream().filter(each 
-> 
!AbstractDatabaseMetaDataExecutor.hasDataSource(each)).collect(Collectors.toSet()));
         Collection<String> result = 
databaseNames.stream().filter(AbstractDatabaseMetaDataExecutor::hasDataSource).collect(Collectors.toList());
         if (!SCHEMA_WITHOUT_DATA_SOURCE.isEmpty()) {
diff --git 
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowCurrentUserExecutorTest.java
 
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowCurrentUserExecutorTest.java
index 7892572ca27..04285d88be7 100644
--- 
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowCurrentUserExecutorTest.java
+++ 
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowCurrentUserExecutorTest.java
@@ -81,8 +81,8 @@ class ShowCurrentUserExecutorTest {
     }
     
     private ConnectionSession mockConnectionSession() {
-        ConnectionSession result = mock(ConnectionSession.class);
-        when(result.getGrantee()).thenReturn(GRANTEE);
+        ConnectionSession result = mock(ConnectionSession.class, 
RETURNS_DEEP_STUBS);
+        when(result.getConnectionContext().getGrantee()).thenReturn(GRANTEE);
         return result;
     }
 }
diff --git 
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowDatabasesExecutorTest.java
 
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowDatabasesExecutorTest.java
index ffa02896f53..f67e378b688 100644
--- 
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowDatabasesExecutorTest.java
+++ 
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowDatabasesExecutorTest.java
@@ -220,8 +220,8 @@ class ShowDatabasesExecutorTest {
     }
     
     private ConnectionSession mockConnectionSession() {
-        ConnectionSession result = mock(ConnectionSession.class);
-        when(result.getGrantee()).thenReturn(new Grantee("root", ""));
+        ConnectionSession result = mock(ConnectionSession.class, 
RETURNS_DEEP_STUBS);
+        when(result.getConnectionContext().getGrantee()).thenReturn(new 
Grantee("root", ""));
         return result;
     }
 }
diff --git 
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/UseDatabaseExecutorTest.java
 
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/UseDatabaseExecutorTest.java
index f7343046bad..ef5119de2ee 100644
--- 
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/UseDatabaseExecutorTest.java
+++ 
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/UseDatabaseExecutorTest.java
@@ -36,6 +36,7 @@ import org.apache.shardingsphere.test.mock.AutoMockExtension;
 import org.apache.shardingsphere.test.mock.StaticMockSettings;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Answers;
 import org.mockito.Mock;
 
 import java.util.HashMap;
@@ -55,7 +56,7 @@ class UseDatabaseExecutorTest {
     
     private static final String DATABASE_PATTERN = "db_%s";
     
-    @Mock
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private ConnectionSession connectionSession;
     
     @Test
diff --git 
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutorTest.java
 
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutorTest.java
index 0c0e567c026..e057cf0fd63 100644
--- 
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutorTest.java
+++ 
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutorTest.java
@@ -45,6 +45,7 @@ import org.apache.shardingsphere.test.mock.StaticMockSettings;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.MockedConstruction;
 import org.mockito.junit.jupiter.MockitoSettings;
@@ -84,12 +85,12 @@ class SelectInformationSchemataExecutorTest {
     
     private SelectStatement statement;
     
-    @Mock
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private ConnectionSession connectionSession;
     
     @BeforeEach
     void setUp() {
-        when(connectionSession.getGrantee()).thenReturn(grantee);
+        
when(connectionSession.getConnectionContext().getGrantee()).thenReturn(grantee);
         statement = (SelectStatement) new SQLParserRule(
                 new 
DefaultSQLParserRuleConfigurationBuilder().build()).getSQLParserEngine(TypedSPILoader.getService(DatabaseType.class,
 "MySQL")).parse(sql, false);
     }
diff --git 
a/proxy/frontend/core/src/main/java/org/apache/shardingsphere/proxy/frontend/command/CommandExecutorTask.java
 
b/proxy/frontend/core/src/main/java/org/apache/shardingsphere/proxy/frontend/command/CommandExecutorTask.java
index 84ba405e62a..548dbf71a7f 100644
--- 
a/proxy/frontend/core/src/main/java/org/apache/shardingsphere/proxy/frontend/command/CommandExecutorTask.java
+++ 
b/proxy/frontend/core/src/main/java/org/apache/shardingsphere/proxy/frontend/command/CommandExecutorTask.java
@@ -110,7 +110,7 @@ public final class CommandExecutorTask implements Runnable {
     
     private void fillLogMDC() {
         MDC.put(LogMDCConstants.DATABASE_KEY, 
connectionSession.getDatabaseName());
-        MDC.put(LogMDCConstants.USER_KEY, 
connectionSession.getGrantee().toString());
+        MDC.put(LogMDCConstants.USER_KEY, 
connectionSession.getConnectionContext().getGrantee().toString());
     }
     
     private boolean executeCommand(final ChannelHandlerContext context, final 
PacketPayload payload) throws SQLException {
diff --git 
a/proxy/frontend/core/src/main/java/org/apache/shardingsphere/proxy/frontend/netty/FrontendChannelInboundHandler.java
 
b/proxy/frontend/core/src/main/java/org/apache/shardingsphere/proxy/frontend/netty/FrontendChannelInboundHandler.java
index 50e2dac80d1..c7c0680af15 100644
--- 
a/proxy/frontend/core/src/main/java/org/apache/shardingsphere/proxy/frontend/netty/FrontendChannelInboundHandler.java
+++ 
b/proxy/frontend/core/src/main/java/org/apache/shardingsphere/proxy/frontend/netty/FrontendChannelInboundHandler.java
@@ -34,6 +34,7 @@ import 
org.apache.shardingsphere.proxy.frontend.spi.DatabaseProtocolFrontendEngi
 import org.apache.shardingsphere.proxy.frontend.state.ProxyStateContext;
 
 import java.util.Optional;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
  * Frontend channel inbound handler.
@@ -47,7 +48,7 @@ public final class FrontendChannelInboundHandler extends 
ChannelInboundHandlerAd
     
     private final ProcessEngine processEngine = new ProcessEngine();
     
-    private volatile boolean authenticated;
+    private final AtomicBoolean authenticated = new AtomicBoolean(false);
     
     public FrontendChannelInboundHandler(final DatabaseProtocolFrontendEngine 
databaseProtocolFrontendEngine, final Channel channel) {
         this.databaseProtocolFrontendEngine = databaseProtocolFrontendEngine;
@@ -63,8 +64,8 @@ public final class FrontendChannelInboundHandler extends 
ChannelInboundHandlerAd
     
     @Override
     public void channelRead(final ChannelHandlerContext context, final Object 
message) {
-        if (!authenticated) {
-            authenticated = authenticate(context, (ByteBuf) message);
+        if (!authenticated.get()) {
+            authenticated.set(authenticate(context, (ByteBuf) message));
             return;
         }
         ProxyStateContext.execute(context, message, 
databaseProtocolFrontendEngine, connectionSession);
@@ -77,7 +78,7 @@ public final class FrontendChannelInboundHandler extends 
ChannelInboundHandlerAd
             if (authResult.isFinished()) {
                 connectionSession.setGrantee(new 
Grantee(authResult.getUsername(), authResult.getHostname()));
                 connectionSession.setCurrentDatabase(authResult.getDatabase());
-                
connectionSession.setProcessId(processEngine.connect(connectionSession.getGrantee(),
 connectionSession.getDatabaseName()));
+                
connectionSession.setProcessId(processEngine.connect(connectionSession.getConnectionContext().getGrantee(),
 connectionSession.getDatabaseName()));
             }
             return authResult.isFinished();
             // CHECKSTYLE:OFF
diff --git 
a/proxy/frontend/core/src/test/java/org/apache/shardingsphere/proxy/frontend/netty/FrontendChannelInboundHandlerTest.java
 
b/proxy/frontend/core/src/test/java/org/apache/shardingsphere/proxy/frontend/netty/FrontendChannelInboundHandlerTest.java
index d7e0c694fbf..7b0ced74f6f 100644
--- 
a/proxy/frontend/core/src/test/java/org/apache/shardingsphere/proxy/frontend/netty/FrontendChannelInboundHandlerTest.java
+++ 
b/proxy/frontend/core/src/test/java/org/apache/shardingsphere/proxy/frontend/netty/FrontendChannelInboundHandlerTest.java
@@ -106,7 +106,7 @@ class FrontendChannelInboundHandlerTest {
         AuthenticationResult authenticationResult = 
AuthenticationResultBuilder.finished("username", "hostname", "database");
         
when(authenticationEngine.authenticate(any(ChannelHandlerContext.class), 
any(PacketPayload.class))).thenReturn(authenticationResult);
         channel.writeInbound(Unpooled.EMPTY_BUFFER);
-        assertThat(connectionSession.getGrantee(), is(new Grantee("username", 
"hostname")));
+        assertThat(connectionSession.getConnectionContext().getGrantee(), 
is(new Grantee("username", "hostname")));
         assertThat(connectionSession.getDatabaseName(), is("database"));
     }
     
diff --git 
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/admin/initdb/MySQLComInitDbExecutor.java
 
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/admin/initdb/MySQLComInitDbExecutor.java
index 2cd3e22bb51..4a37f201084 100644
--- 
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/admin/initdb/MySQLComInitDbExecutor.java
+++ 
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/admin/initdb/MySQLComInitDbExecutor.java
@@ -48,7 +48,7 @@ public final class MySQLComInitDbExecutor implements 
CommandExecutor {
     public Collection<DatabasePacket> execute() {
         String databaseName = SQLUtils.getExactlyValue(packet.getSchema());
         AuthorityRule authorityRule = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(AuthorityRule.class);
-        AuthorityChecker authorityChecker = new 
AuthorityChecker(authorityRule, connectionSession.getGrantee());
+        AuthorityChecker authorityChecker = new 
AuthorityChecker(authorityRule, 
connectionSession.getConnectionContext().getGrantee());
         
ShardingSpherePreconditions.checkState(ProxyContext.getInstance().databaseExists(databaseName)
 && authorityChecker.isAuthorized(databaseName),
                 () -> new UnknownDatabaseException(packet.getSchema()));
         connectionSession.setCurrentDatabase(packet.getSchema());
diff --git 
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
 
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
index 152adbafb4b..51218969215 100644
--- 
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
+++ 
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
@@ -137,7 +137,7 @@ public final class MySQLMultiStatementsHandler implements 
ProxyBackendHandler {
         Map<String, List<ExecutionUnit>> dataSourcesToExecutionUnits = 
buildDataSourcesToExecutionUnits(executionContexts);
         ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext =
                 
prepareEngine.prepare(executionContexts.iterator().next().getRouteContext(), 
samplingExecutionUnit(dataSourcesToExecutionUnits),
-                        new 
ExecutionGroupReportContext(connectionSession.getProcessId(), 
connectionSession.getDatabaseName(), connectionSession.getGrantee()));
+                        new 
ExecutionGroupReportContext(connectionSession.getProcessId(), 
connectionSession.getDatabaseName(), 
connectionSession.getConnectionContext().getGrantee()));
         for (ExecutionGroup<JDBCExecutionUnit> each : 
executionGroupContext.getInputGroups()) {
             for (JDBCExecutionUnit unit : each.getInputs()) {
                 prepareBatchedStatement(unit, dataSourcesToExecutionUnits);
diff --git 
a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
 
b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
index e93aeb006a3..2cd40359979 100644
--- 
a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
+++ 
b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
@@ -153,7 +153,7 @@ public final class PostgreSQLBatchedStatementsExecutor {
                 connectionSession.getDatabaseConnectionManager(), 
(JDBCBackendStatement) connectionSession.getStatementManager(),
                 new StatementOption(false), rules, 
metaDataContexts.getMetaData().getDatabase(connectionSession.getDatabaseName()).getResourceMetaData().getStorageUnits());
         executionGroupContext = 
prepareEngine.prepare(anyExecutionContext.getRouteContext(), 
executionUnitParams.keySet(),
-                new 
ExecutionGroupReportContext(connectionSession.getProcessId(), 
connectionSession.getDatabaseName(), connectionSession.getGrantee()));
+                new 
ExecutionGroupReportContext(connectionSession.getProcessId(), 
connectionSession.getDatabaseName(), 
connectionSession.getConnectionContext().getGrantee()));
         for (ExecutionGroup<JDBCExecutionUnit> eachGroup : 
executionGroupContext.getInputGroups()) {
             for (JDBCExecutionUnit each : eachGroup.getInputs()) {
                 prepareJDBCExecutionUnit(each);

Reply via email to