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 10:40:32 UTC
[shardingsphere] branch master updated: Refactor TablePrivilege
(#9732)
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 80b9c18 Refactor TablePrivilege (#9732)
80b9c18 is described below
commit 80b9c182834829c589501b1a19822db0d3ed365b
Author: Liang Zhang <te...@163.com>
AuthorDate: Thu Mar 18 18:39:59 2021 +0800
Refactor TablePrivilege (#9732)
* Refactor TablePrivilege
* Refactor MySQLPrivilegeLoader
---
.../loader/dialect/MySQLPrivilegeLoader.java | 113 ++++++++++-----------
.../privilege/admin/AdministrativePrivilege.java | 4 +-
.../privilege/database/DatabasePrivilege.java | 8 +-
.../model/privilege/database/SchemaPrivilege.java | 8 +-
.../model/privilege/database/TablePrivilege.java | 5 +-
.../type/CreateUserStatementAuthRefresher.java | 4 +-
6 files changed, 65 insertions(+), 77 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 c478b45..e1aea1d 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
@@ -29,7 +29,10 @@ import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.Optional;
+import java.util.stream.Collectors;
/**
* MySQL privilege loader.
@@ -196,7 +199,7 @@ public final class MySQLPrivilegeLoader implements PrivilegeLoader {
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=?");
+ 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();
@@ -287,71 +290,61 @@ public final class MySQLPrivilegeLoader implements PrivilegeLoader {
private void fillTablePrivilege(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.tables_priv where user=? and host=?");
- statement.setString(1, user.getGrantee().getUsername());
- statement.setString(2, user.getGrantee().getHostname());
- ResultSet resultSet = statement.executeQuery();
- while (resultSet.next()) {
- String schema = resultSet.getString("Db");
- String tableName = resultSet.getString("Table_name");
- TablePrivilege tablePrivilege = new TablePrivilege(tableName);
- String[] privs = (String[]) resultSet.getArray("Table_priv").getArray();
- for (String each : privs) {
- switch (each) {
- case "Select":
- tablePrivilege.getPrivileges().add(PrivilegeType.SELECT);
- break;
- case "Insert":
- tablePrivilege.getPrivileges().add(PrivilegeType.INSERT);
- break;
- case "Update":
- tablePrivilege.getPrivileges().add(PrivilegeType.UPDATE);
- break;
- case "Delete":
- tablePrivilege.getPrivileges().add(PrivilegeType.DELETE);
- break;
- case "Create":
- tablePrivilege.getPrivileges().add(PrivilegeType.CREATE);
- break;
- case "Drop":
- tablePrivilege.getPrivileges().add(PrivilegeType.DROP);
- break;
- case "Grant":
- tablePrivilege.getPrivileges().add(PrivilegeType.GRANT);
- break;
- case "References":
- tablePrivilege.getPrivileges().add(PrivilegeType.REFERENCES);
- break;
- case "Index":
- tablePrivilege.getPrivileges().add(PrivilegeType.INDEX);
- break;
- case "Alter":
- tablePrivilege.getPrivileges().add(PrivilegeType.ALTER);
- break;
- case "Create View":
- tablePrivilege.getPrivileges().add(PrivilegeType.CREATE_VIEW);
- break;
- case "Show view":
- tablePrivilege.getPrivileges().add(PrivilegeType.SHOW_VIEW);
- break;
- case "Trigger":
- tablePrivilege.getPrivileges().add(PrivilegeType.TRIGGER);
- break;
- default:
- break;
+ 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());
+ try (ResultSet resultSet = preparedStatement.executeQuery()) {
+ while (resultSet.next()) {
+ String db = resultSet.getString("Db");
+ String tableName = resultSet.getString("Table_name");
+ String[] tablePrivileges = (String[]) resultSet.getArray("Table_priv").getArray();
+ TablePrivilege tablePrivilege = new TablePrivilege(tableName, getPrivileges(tablePrivileges));
+ if (!privilege.getDatabasePrivilege().getSpecificPrivileges().containsKey(db)) {
+ privilege.getDatabasePrivilege().getSpecificPrivileges().put(db, new SchemaPrivilege(db));
}
- }
- if (privilege.getDatabasePrivilege().getSpecificPrivileges().containsKey(schema)) {
- privilege.getDatabasePrivilege().getSpecificPrivileges().get(schema).getSpecificPrivileges().put(tableName, tablePrivilege);
- } else {
- SchemaPrivilege schemaPrivilege = new SchemaPrivilege(schema);
- schemaPrivilege.getSpecificPrivileges().put(tableName, tablePrivilege);
- privilege.getDatabasePrivilege().getSpecificPrivileges().put(schema, schemaPrivilege);
+ privilege.getDatabasePrivilege().getSpecificPrivileges().get(db).getSpecificPrivileges().put(tableName, tablePrivilege);
}
}
}
}
+ private Collection<PrivilegeType> getPrivileges(final String[] privileges) {
+ return Arrays.stream(privileges).map(this::getPrivilegeType).collect(Collectors.toSet());
+ }
+
+ private PrivilegeType getPrivilegeType(final String privilege) {
+ switch (privilege) {
+ case "Select":
+ return PrivilegeType.SELECT;
+ case "Insert":
+ return PrivilegeType.INSERT;
+ case "Update":
+ return PrivilegeType.UPDATE;
+ case "Delete":
+ return PrivilegeType.DELETE;
+ case "Create":
+ return PrivilegeType.CREATE;
+ 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 "Create View":
+ return PrivilegeType.CREATE_VIEW;
+ case "Show view":
+ return PrivilegeType.SHOW_VIEW;
+ case "Trigger":
+ return PrivilegeType.TRIGGER;
+ default:
+ throw new UnsupportedOperationException(privilege);
+ }
+ }
+
@Override
public String getDatabaseType() {
return "MySQL";
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/admin/AdministrativePrivilege.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/admin/AdministrativePrivilege.java
index 5cf111e..9494aa2 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/admin/AdministrativePrivilege.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/admin/AdministrativePrivilege.java
@@ -22,7 +22,7 @@ import lombok.Getter;
import org.apache.shardingsphere.infra.metadata.auth.model.privilege.PrivilegeType;
import java.util.Collection;
-import java.util.LinkedHashSet;
+import java.util.concurrent.CopyOnWriteArraySet;
/**
* Administrative privilege.
@@ -31,7 +31,7 @@ import java.util.LinkedHashSet;
@EqualsAndHashCode
public final class AdministrativePrivilege {
- private final Collection<PrivilegeType> privileges = new LinkedHashSet<>();
+ private final Collection<PrivilegeType> privileges = new CopyOnWriteArraySet<>();
/**
* Has privileges.
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/DatabasePrivilege.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/DatabasePrivilege.java
index 4a85c8d..d4fe67f 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/DatabasePrivilege.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/DatabasePrivilege.java
@@ -22,9 +22,9 @@ import lombok.Getter;
import org.apache.shardingsphere.infra.metadata.auth.model.privilege.PrivilegeType;
import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
import java.util.stream.Collectors;
/**
@@ -34,9 +34,9 @@ import java.util.stream.Collectors;
@EqualsAndHashCode
public final class DatabasePrivilege {
- private final Collection<PrivilegeType> globalPrivileges = new LinkedHashSet<>();
+ private final Collection<PrivilegeType> globalPrivileges = new CopyOnWriteArraySet<>();
- private final Map<String, SchemaPrivilege> specificPrivileges = new LinkedHashMap<>();
+ private final Map<String, SchemaPrivilege> specificPrivileges = new ConcurrentHashMap<>();
/**
* Has privileges.
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/SchemaPrivilege.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/SchemaPrivilege.java
index 148ca40..b701797 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/SchemaPrivilege.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/SchemaPrivilege.java
@@ -23,9 +23,9 @@ import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.metadata.auth.model.privilege.PrivilegeType;
import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
import java.util.stream.Collectors;
/**
@@ -38,9 +38,9 @@ public final class SchemaPrivilege {
private final String name;
- private final Collection<PrivilegeType> globalPrivileges = new LinkedHashSet<>();
+ private final Collection<PrivilegeType> globalPrivileges = new CopyOnWriteArraySet<>();
- private final Map<String, TablePrivilege> specificPrivileges = new LinkedHashMap<>();
+ private final Map<String, TablePrivilege> specificPrivileges = new ConcurrentHashMap<>();
/**
* Has privileges.
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/TablePrivilege.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/TablePrivilege.java
index b74bf6d..70cee15 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/TablePrivilege.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/TablePrivilege.java
@@ -18,24 +18,21 @@
package org.apache.shardingsphere.infra.metadata.auth.model.privilege.database;
import lombok.EqualsAndHashCode;
-import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.metadata.auth.model.privilege.PrivilegeType;
import java.util.Collection;
-import java.util.LinkedHashSet;
/**
* Table privilege.
*/
@RequiredArgsConstructor
-@Getter
@EqualsAndHashCode
public final class TablePrivilege {
private final String tableName;
- private final Collection<PrivilegeType> privileges = new LinkedHashSet<>();
+ private final Collection<PrivilegeType> privileges;
/**
* Has privileges.
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/refresher/type/CreateUserStatementAuthRefresher.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/refresher/type/CreateUserStatementAuthRefresher.java
index 4be1afd..b0fcc9b 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/refresher/type/CreateUserStatementAuthRefresher.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/refresher/type/CreateUserStatementAuthRefresher.java
@@ -38,9 +38,7 @@ public final class CreateUserStatementAuthRefresher implements AuthenticationRef
@Override
public void refresh(final Authentication authentication, final SQLStatement sqlStatement, final ShardingSphereMetaData metaData) {
Collection<ShardingSphereUser> users = generateUsers((CreateUserStatement) sqlStatement);
- for (ShardingSphereUser each : authentication.getAuthentication().keySet()) {
- users.add(each);
- }
+ users.addAll(authentication.getAuthentication().keySet());
ShardingSphereEventBus.getInstance().post(new CreateUserEvent(users));
}