You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2021/03/18 13:24:10 UTC

[shardingsphere] branch master updated: Refactor MySQLPrivilegeLoader (#9737)

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

panjuan 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 b9a9969  Refactor MySQLPrivilegeLoader (#9737)
b9a9969 is described below

commit b9a9969f23861d9aa26d55056d9fb4f168f69e07
Author: Liang Zhang <te...@163.com>
AuthorDate: Thu Mar 18 21:23:36 2021 +0800

    Refactor MySQLPrivilegeLoader (#9737)
    
    * Refactor MySQLPrivilegeLoader
    
    * Refactor MySQLPrivilegeLoader
    
    * Refactor MySQLPrivilegeLoader
    
    * Refactor MySQLPrivilegeLoader
---
 .../loader/dialect/MySQLPrivilegeLoader.java       | 296 +++++----------------
 1 file changed, 66 insertions(+), 230 deletions(-)

diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/dialect/MySQLPrivilegeLoader.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/dialect/MySQLPrivilegeLoader.java
index 8c9fc4c..8eb3dd6 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/dialect/MySQLPrivilegeLoader.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/dialect/MySQLPrivilegeLoader.java
@@ -31,6 +31,7 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.LinkedList;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
@@ -50,246 +51,81 @@ public final class MySQLPrivilegeLoader implements PrivilegeLoader {
     
     private void fillGlobalPrivilege(final ShardingSpherePrivilege privilege, final DataSource dataSource, final ShardingSphereUser user) throws SQLException {
         try (Connection connection = dataSource.getConnection()) {
-            connection.setAutoCommit(true);
-            PreparedStatement statement = connection.prepareStatement("SELECT * FROM mysql.user WHERE user=? and host=?");
-            statement.setString(1, user.getGrantee().getUsername());
-            statement.setString(2, user.getGrantee().getHostname());
-            ResultSet resultSet = statement.executeQuery();
-            if (resultSet.first()) {
-                boolean selectPrivilege = resultSet.getBoolean("Select_priv");
-                if (selectPrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.SELECT);
-                    privilege.getDatabasePrivilege().getGlobalPrivileges().add(PrivilegeType.SELECT);
-                }
-                boolean insertPrivilege = resultSet.getBoolean("Insert_priv");
-                if (insertPrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.INSERT);
-                    privilege.getDatabasePrivilege().getGlobalPrivileges().add(PrivilegeType.INSERT);
-                }
-                boolean updatePrivilege = resultSet.getBoolean("Update_priv");
-                if (updatePrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.UPDATE);
-                    privilege.getDatabasePrivilege().getGlobalPrivileges().add(PrivilegeType.UPDATE);
-                }
-                boolean deletePrivilege = resultSet.getBoolean("Delete_priv");
-                if (deletePrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.DELETE);
-                    privilege.getDatabasePrivilege().getGlobalPrivileges().add(PrivilegeType.DELETE);
-                }
-                boolean createPrivilege = resultSet.getBoolean("Create_priv");
-                if (createPrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.CREATE);
-                    privilege.getDatabasePrivilege().getGlobalPrivileges().add(PrivilegeType.CREATE);
-                }
-                boolean dropPrivilege = resultSet.getBoolean("Drop_priv");
-                if (dropPrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.DROP);
-                    privilege.getDatabasePrivilege().getGlobalPrivileges().add(PrivilegeType.DROP);
-                }
-                boolean reloadPrivilege = resultSet.getBoolean("Reload_priv");
-                if (reloadPrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.RELOAD);
-                }
-                boolean shutdownPrivilege = resultSet.getBoolean("Shutdown_priv");
-                if (shutdownPrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.SHUTDOWN);
-                }
-                boolean processPrivilege = resultSet.getBoolean("Process_priv");
-                if (processPrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.PROCESS);
-                }
-                boolean filePrivilege = resultSet.getBoolean("File_priv");
-                if (filePrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.FILE);
-                }
-                boolean grantPrivilege = resultSet.getBoolean("Grant_priv");
-                if (grantPrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.GRANT);
-                    privilege.getDatabasePrivilege().getGlobalPrivileges().add(PrivilegeType.GRANT);
-                }
-                boolean referencesPrivilege = resultSet.getBoolean("References_priv");
-                if (referencesPrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.REFERENCES);
-                    privilege.getDatabasePrivilege().getGlobalPrivileges().add(PrivilegeType.REFERENCES);
-                }
-                boolean indexPrivilege = resultSet.getBoolean("Index_priv");
-                if (indexPrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.INDEX);
-                    privilege.getDatabasePrivilege().getGlobalPrivileges().add(PrivilegeType.INDEX);
-                }
-                boolean alterPrivilege = resultSet.getBoolean("Alter_priv");
-                if (alterPrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.ALTER);
-                    privilege.getDatabasePrivilege().getGlobalPrivileges().add(PrivilegeType.ALTER);
-                }
-                boolean showDbPrivilege = resultSet.getBoolean("Show_db_priv");
-                if (showDbPrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.SHOW_DB);
-                }
-                boolean superPrivilege = resultSet.getBoolean("Super_priv");
-                if (superPrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.SUPER);
-                }
-                boolean createTmpTablePrivilege = resultSet.getBoolean("Create_tmp_table_priv");
-                if (createTmpTablePrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.CREATE_TMP);
-                    privilege.getDatabasePrivilege().getGlobalPrivileges().add(PrivilegeType.CREATE_TMP);
-                }
-                boolean lockTablesPrivilege = resultSet.getBoolean("Lock_tables_priv");
-                if (lockTablesPrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.LOCK_TABLES);
-                    privilege.getDatabasePrivilege().getGlobalPrivileges().add(PrivilegeType.LOCK_TABLES);
-                }
-                boolean executePrivilege = resultSet.getBoolean("Execute_priv");
-                if (executePrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.EXECUTE);
-                    privilege.getDatabasePrivilege().getGlobalPrivileges().add(PrivilegeType.EXECUTE);
-                }
-                boolean replSlavePrivilege = resultSet.getBoolean("Repl_slave_priv");
-                if (replSlavePrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.REPL_SLAVE);
-                }
-                boolean replClientPrivilege = resultSet.getBoolean("Repl_client_priv");
-                if (replClientPrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.REPL_CLIENT);
-                }
-                boolean createViewPrivilege = resultSet.getBoolean("Create_view_priv");
-                if (createViewPrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.CREATE_VIEW);
-                    privilege.getDatabasePrivilege().getGlobalPrivileges().add(PrivilegeType.CREATE_VIEW);
-                }
-                boolean showViewPrivilege = resultSet.getBoolean("Show_view_priv");
-                if (showViewPrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.SHOW_VIEW);
-                    privilege.getDatabasePrivilege().getGlobalPrivileges().add(PrivilegeType.SHOW_VIEW);
-                }
-                boolean createRoutinePrivilege = resultSet.getBoolean("Create_routine_priv");
-                if (createRoutinePrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.CREATE_PROC);
-                    privilege.getDatabasePrivilege().getGlobalPrivileges().add(PrivilegeType.CREATE_PROC);
-                }
-                boolean alterRoutinePrivilege = resultSet.getBoolean("Alter_routine_priv");
-                if (alterRoutinePrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.ALTER_PROC);
-                    privilege.getDatabasePrivilege().getGlobalPrivileges().add(PrivilegeType.ALTER_PROC);
-                }
-                boolean createUserPrivilege = resultSet.getBoolean("Create_user_priv");
-                if (createUserPrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.CREATE_USER);
-                }
-                boolean eventPrivilege = resultSet.getBoolean("Event_priv");
-                if (eventPrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.EVENT);
-                    privilege.getDatabasePrivilege().getGlobalPrivileges().add(PrivilegeType.EVENT);
-                }
-                boolean triggerPrivilege = resultSet.getBoolean("Trigger_priv");
-                if (triggerPrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.TRIGGER);
-                    privilege.getDatabasePrivilege().getGlobalPrivileges().add(PrivilegeType.TRIGGER);
-                }
-                boolean createTablespacePrivilege = resultSet.getBoolean("Create_tablespace_priv");
-                if (createTablespacePrivilege) {
-                    privilege.getAdministrativePrivilege().getPrivileges().add(PrivilegeType.CREATE_TABLESPACE);
+            PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM mysql.user WHERE user=? AND host=?");
+            preparedStatement.setString(1, user.getGrantee().getUsername());
+            preparedStatement.setString(2, user.getGrantee().getHostname());
+            try (ResultSet resultSet = preparedStatement.executeQuery()) {
+                if (resultSet.first()) {
+                    privilege.getAdministrativePrivilege().getPrivileges().addAll(loadAdministrativePrivileges(resultSet));
+                    privilege.getDatabasePrivilege().getGlobalPrivileges().addAll(loadDatabaseGlobalPrivileges(resultSet));
                 }
             }
         }
-        
+    }
+    
+    private Collection<PrivilegeType> loadAdministrativePrivileges(final ResultSet resultSet) throws SQLException {
+        Collection<PrivilegeType> result = new LinkedList<>();
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Super_priv"), PrivilegeType.SUPER, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Reload_priv"), PrivilegeType.RELOAD, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Shutdown_priv"), PrivilegeType.SHUTDOWN, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Process_priv"), PrivilegeType.PROCESS, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("File_priv"), PrivilegeType.FILE, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Show_db_priv"), PrivilegeType.SHOW_DB, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Repl_slave_priv"), PrivilegeType.REPL_SLAVE, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Repl_client_priv"), PrivilegeType.REPL_CLIENT, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Create_user_priv"), PrivilegeType.CREATE_USER, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Create_tablespace_priv"), PrivilegeType.CREATE_TABLESPACE, result);
+        return result;
+    }
+    
+    private Collection<PrivilegeType> loadDatabaseGlobalPrivileges(final ResultSet resultSet) throws SQLException {
+        Collection<PrivilegeType> result = new LinkedList<>();
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Select_priv"), PrivilegeType.SELECT, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Insert_priv"), PrivilegeType.INSERT, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Update_priv"), PrivilegeType.UPDATE, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Delete_priv"), PrivilegeType.DELETE, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Create_priv"), PrivilegeType.CREATE, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Alter_priv"), PrivilegeType.ALTER, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Drop_priv"), PrivilegeType.DROP, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Grant_priv"), PrivilegeType.GRANT, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Index_priv"), PrivilegeType.INDEX, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("References_priv"), PrivilegeType.REFERENCES, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Create_tmp_table_priv"), PrivilegeType.CREATE_TMP, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Lock_tables_priv"), PrivilegeType.LOCK_TABLES, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Execute_priv"), PrivilegeType.EXECUTE, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Create_view_priv"), PrivilegeType.CREATE_VIEW, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Show_view_priv"), PrivilegeType.SHOW_VIEW, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Create_routine_priv"), PrivilegeType.CREATE_PROC, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Alter_routine_priv"), PrivilegeType.ALTER_PROC, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Event_priv"), PrivilegeType.EVENT, result);
+        addToPrivilegeTypesIfPresent(resultSet.getBoolean("Trigger_priv"), PrivilegeType.TRIGGER, result);
+        return result;
+    }
+    
+    private void addToPrivilegeTypesIfPresent(final boolean hasPrivilege, final PrivilegeType privilegeType, final Collection<PrivilegeType> target) {
+        if (hasPrivilege) {
+            target.add(privilegeType);
+        }
     }
     
     private void fillSchemaPrivilege(final ShardingSpherePrivilege privilege, final DataSource dataSource, final ShardingSphereUser user) throws SQLException {
         try (Connection connection = dataSource.getConnection()) {
-            connection.setAutoCommit(true);
-            PreparedStatement statement = connection.prepareStatement("SELECT * FROM mysql.db WHERE user=? AND host=?");
-            statement.setString(1, user.getGrantee().getUsername());
-            statement.setString(2, user.getGrantee().getHostname());
-            ResultSet resultSet = statement.executeQuery();
-            while (resultSet.first()) {
-                String schema = resultSet.getString("Db");
-                SchemaPrivilege schemaPrivilege = new SchemaPrivilege(schema);
-                boolean selectPrivilege = resultSet.getBoolean("Select_priv");
-                if (selectPrivilege) {
-                    schemaPrivilege.getGlobalPrivileges().add(PrivilegeType.SELECT);
-                }
-                boolean insertPrivilege = resultSet.getBoolean("Insert_priv");
-                if (insertPrivilege) {
-                    schemaPrivilege.getGlobalPrivileges().add(PrivilegeType.INSERT);
-                }
-                boolean updatePrivilege = resultSet.getBoolean("Update_priv");
-                if (updatePrivilege) {
-                    schemaPrivilege.getGlobalPrivileges().add(PrivilegeType.UPDATE);
-                }
-                boolean deletePrivilege = resultSet.getBoolean("Delete_priv");
-                if (deletePrivilege) {
-                    schemaPrivilege.getGlobalPrivileges().add(PrivilegeType.DELETE);
-                }
-                boolean createPrivilege = resultSet.getBoolean("Create_priv");
-                if (createPrivilege) {
-                    schemaPrivilege.getGlobalPrivileges().add(PrivilegeType.CREATE);
-                }
-                boolean dropPrivilege = resultSet.getBoolean("Drop_priv");
-                if (dropPrivilege) {
-                    schemaPrivilege.getGlobalPrivileges().add(PrivilegeType.DROP);
-                }
-                boolean grantPrivilege = resultSet.getBoolean("Grant_priv");
-                if (grantPrivilege) {
-                    schemaPrivilege.getGlobalPrivileges().add(PrivilegeType.GRANT);
-                }
-                boolean referencesPrivilege = resultSet.getBoolean("References_priv");
-                if (referencesPrivilege) {
-                    schemaPrivilege.getGlobalPrivileges().add(PrivilegeType.REFERENCES);
-                }
-                boolean indexPrivilege = resultSet.getBoolean("Index_priv");
-                if (indexPrivilege) {
-                    schemaPrivilege.getGlobalPrivileges().add(PrivilegeType.INDEX);
-                }
-                boolean alterPrivilege = resultSet.getBoolean("Alter_priv");
-                if (alterPrivilege) {
-                    schemaPrivilege.getGlobalPrivileges().add(PrivilegeType.ALTER);
-                }
-                boolean createTmpTablePrivilege = resultSet.getBoolean("Create_tmp_table_priv");
-                if (createTmpTablePrivilege) {
-                    schemaPrivilege.getGlobalPrivileges().add(PrivilegeType.CREATE_TMP);
-                }
-                boolean lockTablesPrivilege = resultSet.getBoolean("Lock_tables_priv");
-                if (lockTablesPrivilege) {
-                    schemaPrivilege.getGlobalPrivileges().add(PrivilegeType.LOCK_TABLES);
-                }
-                boolean executePrivilege = resultSet.getBoolean("Execute_priv");
-                if (executePrivilege) {
-                    schemaPrivilege.getGlobalPrivileges().add(PrivilegeType.EXECUTE);
-                }
-                boolean createViewPrivilege = resultSet.getBoolean("Create_view_priv");
-                if (createViewPrivilege) {
-                    schemaPrivilege.getGlobalPrivileges().add(PrivilegeType.CREATE_VIEW);
-                }
-                boolean showViewPrivilege = resultSet.getBoolean("Show_view_priv");
-                if (showViewPrivilege) {
-                    schemaPrivilege.getGlobalPrivileges().add(PrivilegeType.SHOW_VIEW);
-                }
-                boolean createRoutinePrivilege = resultSet.getBoolean("Create_routine_priv");
-                if (createRoutinePrivilege) {
-                    schemaPrivilege.getGlobalPrivileges().add(PrivilegeType.CREATE_PROC);
-                }
-                boolean alterRoutinePrivilege = resultSet.getBoolean("Alter_routine_priv");
-                if (alterRoutinePrivilege) {
-                    schemaPrivilege.getGlobalPrivileges().add(PrivilegeType.ALTER_PROC);
-                }
-                boolean eventPrivilege = resultSet.getBoolean("Event_priv");
-                if (eventPrivilege) {
-                    schemaPrivilege.getGlobalPrivileges().add(PrivilegeType.EVENT);
-                }
-                boolean triggerPrivilege = resultSet.getBoolean("Trigger_priv");
-                if (triggerPrivilege) {
-                    schemaPrivilege.getGlobalPrivileges().add(PrivilegeType.TRIGGER);
+            PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM mysql.db WHERE user=? AND host=?");
+            preparedStatement.setString(1, user.getGrantee().getUsername());
+            preparedStatement.setString(2, user.getGrantee().getHostname());
+            try (ResultSet resultSet = preparedStatement.executeQuery()) {
+                while (resultSet.first()) {
+                    String db = resultSet.getString("Db");
+                    SchemaPrivilege schemaPrivilege = new SchemaPrivilege(db);
+                    schemaPrivilege.getGlobalPrivileges().addAll(loadDatabaseGlobalPrivileges(resultSet));
+                    privilege.getDatabasePrivilege().getSpecificPrivileges().put(db, schemaPrivilege);
                 }
-                privilege.getDatabasePrivilege().getSpecificPrivileges().put(schema, schemaPrivilege);
             }
         }
     }
     
     private void fillTablePrivilege(final ShardingSpherePrivilege privilege, final DataSource dataSource, final ShardingSphereUser user) throws SQLException {
         try (Connection connection = dataSource.getConnection()) {
-            connection.setAutoCommit(true);
             PreparedStatement preparedStatement = connection.prepareStatement("SELECT Db, Table_name, Table_priv FROM mysql.tables_priv WHERE user=? AND host=?");
             preparedStatement.setString(1, user.getGrantee().getUsername());
             preparedStatement.setString(2, user.getGrantee().getHostname());
@@ -324,16 +160,16 @@ public final class MySQLPrivilegeLoader implements PrivilegeLoader {
                 return PrivilegeType.DELETE;
             case "Create":
                 return PrivilegeType.CREATE;
+            case "Alter":
+                return PrivilegeType.ALTER;
             case "Drop":
                 return PrivilegeType.DROP;
             case "Grant":
                 return PrivilegeType.GRANT;
-            case "References":
-                return PrivilegeType.REFERENCES;
             case "Index":
                 return PrivilegeType.INDEX;
-            case "Alter":
-                return PrivilegeType.ALTER;
+            case "References":
+                return PrivilegeType.REFERENCES;
             case "Create View":
                 return PrivilegeType.CREATE_VIEW;
             case "Show view":