This is an automated email from the ASF dual-hosted git repository.
shuwenwei pushed a commit to branch AuthEnhance
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/AuthEnhance by this push:
new 466bdace1cf check author statement
466bdace1cf is described below
commit 466bdace1cf562419fea7b7e4423a27164c63416
Author: shuwenwei <[email protected]>
AuthorDate: Wed Sep 17 18:17:45 2025 +0800
check author statement
---
.../execution/config/TableConfigTaskVisitor.java | 6 ++
.../execution/config/TreeConfigTaskVisitor.java | 6 ++
.../relational/security/AccessControlImpl.java | 47 +-----------
.../security/TreeAccessCheckVisitor.java | 56 ++------------
.../sql/ast/RelationalAuthorStatement.java | 89 ++++++++++++++++++++++
.../plan/statement/sys/AuthorStatement.java | 32 ++++++++
6 files changed, 142 insertions(+), 94 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
index 212497ef856..cbfa9edbf49 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
@@ -20,6 +20,7 @@
package org.apache.iotdb.db.queryengine.plan.execution.config;
import org.apache.iotdb.common.rpc.thrift.Model;
+import org.apache.iotdb.common.rpc.thrift.TSStatus;
import org.apache.iotdb.commons.auth.entity.PrivilegeType;
import org.apache.iotdb.commons.auth.entity.User;
import org.apache.iotdb.commons.exception.IllegalPathException;
@@ -228,6 +229,7 @@ import
org.apache.iotdb.db.queryengine.plan.statement.sys.StartRepairDataStateme
import
org.apache.iotdb.db.queryengine.plan.statement.sys.StopRepairDataStatement;
import org.apache.iotdb.db.utils.DataNodeAuthUtils;
import org.apache.iotdb.pipe.api.customizer.parameter.PipeParameters;
+import org.apache.iotdb.rpc.TSStatusCode;
import org.apache.tsfile.common.conf.TSFileConfig;
import org.apache.tsfile.enums.TSDataType;
@@ -1323,6 +1325,10 @@ public class TableConfigTaskVisitor extends
AstVisitor<IConfigTask, MPPQueryCont
@Override
protected IConfigTask visitRelationalAuthorPlan(
RelationalAuthorStatement node, MPPQueryContext context) {
+ TSStatus status =
node.checkStatementIsValid(context.getSession().getUserName());
+ if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ throw new SemanticException(status.getMessage());
+ }
accessControl.checkUserCanRunRelationalAuthorStatement(
context.getSession().getUserName(), node);
context.setQueryType(node.getQueryType());
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TreeConfigTaskVisitor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TreeConfigTaskVisitor.java
index 4ea9513320c..d84b4aa7d9c 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TreeConfigTaskVisitor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TreeConfigTaskVisitor.java
@@ -20,6 +20,7 @@
package org.apache.iotdb.db.queryengine.plan.execution.config;
import org.apache.iotdb.common.rpc.thrift.Model;
+import org.apache.iotdb.common.rpc.thrift.TSStatus;
import org.apache.iotdb.commons.auth.entity.User;
import org.apache.iotdb.commons.executable.ExecutableManager;
import org.apache.iotdb.commons.path.PartialPath;
@@ -209,6 +210,7 @@ import
org.apache.iotdb.db.queryengine.plan.statement.sys.quota.SetThrottleQuota
import
org.apache.iotdb.db.queryengine.plan.statement.sys.quota.ShowSpaceQuotaStatement;
import
org.apache.iotdb.db.queryengine.plan.statement.sys.quota.ShowThrottleQuotaStatement;
import org.apache.iotdb.db.utils.DataNodeAuthUtils;
+import org.apache.iotdb.rpc.TSStatusCode;
import org.apache.tsfile.exception.NotImplementedException;
@@ -311,6 +313,10 @@ public class TreeConfigTaskVisitor extends
StatementVisitor<IConfigTask, MPPQuer
if (statement.getAuthorType() == AuthorType.UPDATE_USER) {
visitUpdateUser(statement);
}
+ TSStatus status =
statement.checkStatementIsValid(context.getSession().getUserName());
+ if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ throw new SemanticException(status.getMessage());
+ }
return new AuthorizerTask(statement);
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/AccessControlImpl.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/AccessControlImpl.java
index 3ddd2cd04be..6f95f8337c0 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/AccessControlImpl.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/AccessControlImpl.java
@@ -25,13 +25,11 @@ import
org.apache.iotdb.commons.exception.auth.AccessDeniedException;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.schema.table.InformationSchema;
import org.apache.iotdb.db.auth.AuthorityChecker;
-import org.apache.iotdb.db.exception.sql.SemanticException;
import
org.apache.iotdb.db.queryengine.plan.relational.metadata.QualifiedObjectName;
import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RelationalAuthorStatement;
import org.apache.iotdb.db.queryengine.plan.relational.type.AuthorRType;
import org.apache.iotdb.db.queryengine.plan.statement.Statement;
import org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor;
-import org.apache.iotdb.db.queryengine.plan.statement.sys.AuthorStatement;
import org.apache.iotdb.db.schemaengine.table.InformationSchemaUtils;
import org.apache.iotdb.rpc.TSStatusCode;
@@ -197,20 +195,12 @@ public class AccessControlImpl implements AccessControl {
AuthorRType type = statement.getAuthorType();
switch (type) {
case CREATE_USER:
- // admin cannot be created.
- if (AuthorityChecker.SUPER_USER.equals(statement.getUserName())) {
- throw new AccessDeniedException("Cannot create user has same name
with admin user");
- }
if (AuthorityChecker.SUPER_USER.equals(userName)) {
return;
}
authChecker.checkGlobalPrivilege(userName,
TableModelPrivilege.MANAGE_USER);
return;
case DROP_USER:
- if (AuthorityChecker.SUPER_USER.equals(statement.getUserName())
- || statement.getUserName().equals(userName)) {
- throw new AccessDeniedException("Cannot drop admin user or
yourself");
- }
if (AuthorityChecker.SUPER_USER.equals(userName)) {
return;
}
@@ -230,9 +220,6 @@ public class AccessControlImpl implements AccessControl {
}
return;
case CREATE_ROLE:
- if (AuthorityChecker.SUPER_USER.equals(statement.getRoleName())) {
- throw new AccessDeniedException("Cannot create role has same name
with admin user");
- }
if (AuthorityChecker.SUPER_USER.equals(userName)) {
return;
}
@@ -240,9 +227,6 @@ public class AccessControlImpl implements AccessControl {
return;
case DROP_ROLE:
- if (AuthorityChecker.SUPER_USER.equals(statement.getUserName())) {
- throw new AccessDeniedException("Cannot drop role with admin name");
- }
if (AuthorityChecker.SUPER_USER.equals(userName)) {
return;
}
@@ -250,9 +234,6 @@ public class AccessControlImpl implements AccessControl {
return;
case GRANT_USER_ROLE:
- if (AuthorityChecker.SUPER_USER.equals(statement.getUserName())) {
- throw new AccessDeniedException("Cannot grant role to admin");
- }
if (AuthorityChecker.SUPER_USER.equals(userName)) {
return;
}
@@ -260,9 +241,6 @@ public class AccessControlImpl implements AccessControl {
return;
case REVOKE_USER_ROLE:
- if (AuthorityChecker.SUPER_USER.equals(statement.getUserName())) {
- throw new AccessDeniedException("Cannot revoke role from admin");
- }
if (AuthorityChecker.SUPER_USER.equals(userName)) {
return;
}
@@ -290,9 +268,6 @@ public class AccessControlImpl implements AccessControl {
case GRANT_USER_ANY:
case REVOKE_ROLE_ANY:
case REVOKE_USER_ANY:
- if (AuthorityChecker.SUPER_USER.equals(statement.getUserName())) {
- throw new AccessDeniedException("Cannot grant/revoke privileges of
admin user");
- }
if (hasGlobalPrivilege(userName, PrivilegeType.SECURITY)) {
return;
}
@@ -305,9 +280,6 @@ public class AccessControlImpl implements AccessControl {
case REVOKE_ROLE_ALL:
case GRANT_USER_ALL:
case REVOKE_USER_ALL:
- if (AuthorityChecker.SUPER_USER.equals(statement.getUserName())) {
- throw new AccessDeniedException("Cannot grant/revoke all privileges
of admin user");
- }
if (hasGlobalPrivilege(userName, PrivilegeType.SECURITY)) {
return;
}
@@ -325,13 +297,6 @@ public class AccessControlImpl implements AccessControl {
case GRANT_ROLE_DB:
case REVOKE_USER_DB:
case REVOKE_ROLE_DB:
- if (AuthorityChecker.SUPER_USER.equals(statement.getUserName())) {
- throw new AccessDeniedException("Cannot grant/revoke privileges of
admin user");
- }
- if
(InformationSchema.INFORMATION_DATABASE.equals(statement.getDatabase())) {
- throw new SemanticException(
- "Cannot grant or revoke any privileges to information_schema");
- }
if (hasGlobalPrivilege(userName, PrivilegeType.SECURITY)) {
return;
}
@@ -346,13 +311,6 @@ public class AccessControlImpl implements AccessControl {
case GRANT_ROLE_TB:
case REVOKE_USER_TB:
case REVOKE_ROLE_TB:
- if (AuthorityChecker.SUPER_USER.equals(statement.getUserName())) {
- throw new AccessDeniedException("Cannot grant/revoke privileges of
admin user");
- }
- if
(InformationSchema.INFORMATION_DATABASE.equals(statement.getDatabase())) {
- throw new SemanticException(
- "Cannot grant or revoke any privileges to information_schema");
- }
if (hasGlobalPrivilege(userName, PrivilegeType.SECURITY)) {
return;
}
@@ -368,9 +326,6 @@ public class AccessControlImpl implements AccessControl {
case GRANT_ROLE_SYS:
case REVOKE_USER_SYS:
case REVOKE_ROLE_SYS:
- if (AuthorityChecker.SUPER_USER.equals(statement.getUserName())) {
- throw new AccessDeniedException("Cannot grant/revoke privileges of
admin user");
- }
if (hasGlobalPrivilege(userName, PrivilegeType.SECURITY)) {
return;
}
@@ -414,7 +369,7 @@ public class AccessControlImpl implements AccessControl {
@Override
public TSStatus checkPermissionBeforeProcess(Statement statement, String
userName) {
- if (AuthorityChecker.SUPER_USER.equals(userName) && !(statement instanceof
AuthorStatement)) {
+ if (AuthorityChecker.SUPER_USER.equals(userName)) {
return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
}
return treeAccessCheckVisitor.process(statement, new
TreeAccessCheckContext(userName));
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java
index 6732d3cafd3..3c9ecffffeb 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java
@@ -358,33 +358,14 @@ public class TreeAccessCheckVisitor extends
StatementVisitor<TSStatus, TreeAcces
AuthorType authorType = statement.getAuthorType();
switch (authorType) {
case CREATE_USER:
- if (AuthorityChecker.SUPER_USER.equals(statement.getUserName())) {
- return AuthorityChecker.getTSStatus(
- false, "Cannot create user has same name with admin user");
- }
- if (AuthorityChecker.SUPER_USER.equals(context.userName)) {
- return RpcUtils.SUCCESS_STATUS;
- }
+ case DROP_USER:
return AuthorityChecker.getTSStatus(
AuthorityChecker.checkSystemPermission(context.userName,
PrivilegeType.MANAGE_USER),
PrivilegeType.MANAGE_USER);
case UPDATE_USER:
// users can change passwords of themselves
- if (AuthorityChecker.SUPER_USER.equals(context.userName)
- || statement.getUserName().equals(context.userName)) {
- return RpcUtils.SUCCESS_STATUS;
- }
- return AuthorityChecker.getTSStatus(
- AuthorityChecker.checkSystemPermission(context.userName,
PrivilegeType.MANAGE_USER),
- PrivilegeType.MANAGE_USER);
-
- case DROP_USER:
- if (AuthorityChecker.SUPER_USER.equals(statement.getUserName())
- || statement.getUserName().equals(context.userName)) {
- return AuthorityChecker.getTSStatus(false, "Cannot drop admin user
or yourself");
- }
- if (AuthorityChecker.SUPER_USER.equals(context.userName)) {
+ if (statement.getUserName().equals(context.userName)) {
return RpcUtils.SUCCESS_STATUS;
}
return AuthorityChecker.getTSStatus(
@@ -392,16 +373,14 @@ public class TreeAccessCheckVisitor extends
StatementVisitor<TSStatus, TreeAcces
PrivilegeType.MANAGE_USER);
case LIST_USER:
- if (AuthorityChecker.SUPER_USER.equals(context.userName)
- || AuthorityChecker.checkSystemPermission(context.userName,
PrivilegeType.SECURITY)) {
+ if (AuthorityChecker.checkSystemPermission(context.userName,
PrivilegeType.SECURITY)) {
return RpcUtils.SUCCESS_STATUS;
}
statement.setUserName(context.userName);
return RpcUtils.SUCCESS_STATUS;
case LIST_USER_PRIVILEGE:
- if (AuthorityChecker.SUPER_USER.equals(context.userName)
- || context.userName.equals(statement.getUserName())) {
+ if (context.userName.equals(statement.getUserName())) {
return RpcUtils.SUCCESS_STATUS;
}
return AuthorityChecker.getTSStatus(
@@ -409,9 +388,6 @@ public class TreeAccessCheckVisitor extends
StatementVisitor<TSStatus, TreeAcces
PrivilegeType.MANAGE_USER);
case LIST_ROLE_PRIVILEGE:
- if (AuthorityChecker.SUPER_USER.equals(context.userName)) {
- return RpcUtils.SUCCESS_STATUS;
- }
if (!AuthorityChecker.checkRole(context.userName,
statement.getRoleName())) {
return AuthorityChecker.getTSStatus(
AuthorityChecker.checkSystemPermission(context.userName,
PrivilegeType.MANAGE_ROLE),
@@ -421,9 +397,7 @@ public class TreeAccessCheckVisitor extends
StatementVisitor<TSStatus, TreeAcces
}
case LIST_ROLE:
- if (AuthorityChecker.SUPER_USER.equals(context.userName)
- || AuthorityChecker.checkSystemPermission(
- context.userName, PrivilegeType.MANAGE_ROLE)) {
+ if (AuthorityChecker.checkSystemPermission(context.userName,
PrivilegeType.MANAGE_ROLE)) {
return RpcUtils.SUCCESS_STATUS;
}
// list roles of other user is not allowed
@@ -434,16 +408,9 @@ public class TreeAccessCheckVisitor extends
StatementVisitor<TSStatus, TreeAcces
return RpcUtils.SUCCESS_STATUS;
case CREATE_ROLE:
- if (AuthorityChecker.SUPER_USER.equals(statement.getRoleName())) {
- return AuthorityChecker.getTSStatus(
- false, "Cannot create role has same name with admin user");
- }
case DROP_ROLE:
case GRANT_USER_ROLE:
case REVOKE_USER_ROLE:
- if (AuthorityChecker.SUPER_USER.equals(context.userName)) {
- return RpcUtils.SUCCESS_STATUS;
- }
return AuthorityChecker.getTSStatus(
AuthorityChecker.checkSystemPermission(context.userName,
PrivilegeType.MANAGE_ROLE),
PrivilegeType.MANAGE_ROLE);
@@ -452,12 +419,7 @@ public class TreeAccessCheckVisitor extends
StatementVisitor<TSStatus, TreeAcces
case GRANT_USER:
case GRANT_ROLE:
case REVOKE_ROLE:
- if (AuthorityChecker.SUPER_USER.equals(statement.getUserName())) {
- return AuthorityChecker.getTSStatus(
- false, "Cannot grant/revoke privileges of admin user");
- }
- if (AuthorityChecker.SUPER_USER.equals(context.userName)
- || AuthorityChecker.checkSystemPermission(context.userName,
PrivilegeType.SECURITY)) {
+ if (AuthorityChecker.checkSystemPermission(context.userName,
PrivilegeType.SECURITY)) {
return RpcUtils.SUCCESS_STATUS;
}
@@ -1085,8 +1047,7 @@ public class TreeAccessCheckVisitor extends
StatementVisitor<TSStatus, TreeAcces
// ======================== TTL related ===========================
@Override
public TSStatus visitSetTTL(SetTTLStatement statement,
TreeAccessCheckContext context) {
- if (AuthorityChecker.SUPER_USER.equals(context.userName)
- || AuthorityChecker.checkSystemPermission(context.userName,
PrivilegeType.SYSTEM)) {
+ if (AuthorityChecker.checkSystemPermission(context.userName,
PrivilegeType.SYSTEM)) {
return SUCCEED;
}
List<PartialPath> checkedPaths = statement.getPaths();
@@ -1099,8 +1060,7 @@ public class TreeAccessCheckVisitor extends
StatementVisitor<TSStatus, TreeAcces
@Override
public TSStatus visitShowTTL(ShowTTLStatement showTTLStatement,
TreeAccessCheckContext context) {
- if (AuthorityChecker.SUPER_USER.equals(context.userName)
- || AuthorityChecker.checkSystemPermission(context.userName,
PrivilegeType.SYSTEM)) {
+ if (AuthorityChecker.checkSystemPermission(context.userName,
PrivilegeType.SYSTEM)) {
return SUCCEED;
}
return visitAuthorityInformation(showTTLStatement, context);
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/RelationalAuthorStatement.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/RelationalAuthorStatement.java
index a66d6f022c0..1d4238329c2 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/RelationalAuthorStatement.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/RelationalAuthorStatement.java
@@ -20,8 +20,10 @@ package
org.apache.iotdb.db.queryengine.plan.relational.sql.ast;
import org.apache.iotdb.common.rpc.thrift.TSStatus;
import org.apache.iotdb.commons.auth.entity.PrivilegeType;
+import org.apache.iotdb.commons.schema.table.InformationSchema;
import org.apache.iotdb.commons.utils.AuthUtils;
import org.apache.iotdb.commons.utils.CommonDateTimeUtils;
+import org.apache.iotdb.db.auth.AuthorityChecker;
import org.apache.iotdb.db.queryengine.plan.analyze.QueryType;
import org.apache.iotdb.db.queryengine.plan.relational.type.AuthorRType;
import org.apache.iotdb.db.utils.DataNodeAuthUtils;
@@ -314,4 +316,91 @@ public class RelationalAuthorStatement extends Statement {
public void setOldPassword(String oldPassword) {
this.oldPassword = oldPassword;
}
+
+ public TSStatus checkStatementIsValid(String currentUser) {
+ switch (authorType) {
+ case CREATE_USER:
+ if (AuthorityChecker.SUPER_USER.equals(userName)) {
+ return AuthorityChecker.getTSStatus(
+ false, "Cannot create user has same name with admin user");
+ }
+ break;
+ case CREATE_ROLE:
+ if (AuthorityChecker.SUPER_USER.equals(roleName)) {
+ return AuthorityChecker.getTSStatus(
+ false, "Cannot create role has same name with admin user");
+ }
+ break;
+ case DROP_USER:
+ if (AuthorityChecker.SUPER_USER.equals(userName) ||
userName.equals(currentUser)) {
+ return AuthorityChecker.getTSStatus(false, "Cannot drop admin user
or yourself");
+ }
+ break;
+ case DROP_ROLE:
+ if (AuthorityChecker.SUPER_USER.equals(userName)) {
+ return AuthorityChecker.getTSStatus(false, "Cannot drop role with
admin name");
+ }
+ break;
+ case GRANT_ROLE_ANY:
+ case GRANT_USER_ANY:
+ case REVOKE_ROLE_ANY:
+ case REVOKE_USER_ANY:
+ case GRANT_USER_SYS:
+ case GRANT_ROLE_SYS:
+ case REVOKE_USER_SYS:
+ if (AuthorityChecker.SUPER_USER.equals(userName)) {
+ return AuthorityChecker.getTSStatus(
+ false, "Cannot grant/revoke privileges of admin user");
+ }
+ break;
+ case GRANT_USER_ROLE:
+ if (AuthorityChecker.SUPER_USER.equals(userName)) {
+ return AuthorityChecker.getTSStatus(false, "Cannot grant role to
admin");
+ }
+ break;
+ case REVOKE_USER_ROLE:
+ if (AuthorityChecker.SUPER_USER.equals(userName)) {
+ return AuthorityChecker.getTSStatus(false, "Cannot revoke role from
admin");
+ }
+ break;
+ case GRANT_ROLE_ALL:
+ case REVOKE_ROLE_ALL:
+ case GRANT_USER_ALL:
+ case REVOKE_USER_ALL:
+ if (AuthorityChecker.SUPER_USER.equals(userName)) {
+ return AuthorityChecker.getTSStatus(
+ false, "Cannot grant/revoke all privileges of admin user");
+ }
+ break;
+ case GRANT_USER_DB:
+ case GRANT_ROLE_DB:
+ case REVOKE_USER_DB:
+ case REVOKE_ROLE_DB:
+ if (AuthorityChecker.SUPER_USER.equals(userName)) {
+ return AuthorityChecker.getTSStatus(
+ false, "Cannot grant/revoke privileges/role of admin user");
+ }
+ if (InformationSchema.INFORMATION_DATABASE.equals(database)) {
+ return AuthorityChecker.getTSStatus(
+ false, "Cannot grant or revoke any privileges to
information_schema");
+ }
+ break;
+ case GRANT_USER_TB:
+ case GRANT_ROLE_TB:
+ case REVOKE_USER_TB:
+ case REVOKE_ROLE_TB:
+ if (AuthorityChecker.SUPER_USER.equals(userName)) {
+ return AuthorityChecker.getTSStatus(
+ false, "Cannot grant/revoke privileges/role of admin user");
+ }
+ if (InformationSchema.INFORMATION_DATABASE.equals(database)) {
+ return AuthorityChecker.getTSStatus(
+ false, "Cannot grant or revoke any privileges to
information_schema");
+ }
+ break;
+ default:
+ break;
+ }
+ return RpcUtils.SUCCESS_STATUS;
+ }
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/sys/AuthorStatement.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/sys/AuthorStatement.java
index 7ffdba24b4d..7cf0950e45d 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/sys/AuthorStatement.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/sys/AuthorStatement.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.common.rpc.thrift.TSStatus;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.utils.AuthUtils;
import org.apache.iotdb.commons.utils.CommonDateTimeUtils;
+import org.apache.iotdb.db.auth.AuthorityChecker;
import org.apache.iotdb.db.queryengine.plan.analyze.QueryType;
import org.apache.iotdb.db.queryengine.plan.statement.AuthorType;
import org.apache.iotdb.db.queryengine.plan.statement.IConfigStatement;
@@ -270,4 +271,35 @@ public class AuthorStatement extends Statement implements
IConfigStatement {
}
return null;
}
+
+ public TSStatus checkStatementIsValid(String currentUser) {
+ switch (authorType) {
+ case CREATE_USER:
+ if (AuthorityChecker.SUPER_USER.equals(userName)) {
+ return AuthorityChecker.getTSStatus(
+ false, "Cannot create user has same name with admin user");
+ }
+ break;
+ case DROP_USER:
+ if (AuthorityChecker.SUPER_USER.equals(userName) ||
userName.equals(currentUser)) {
+ return AuthorityChecker.getTSStatus(false, "Cannot drop admin user
or yourself");
+ }
+ case CREATE_ROLE:
+ if (AuthorityChecker.SUPER_USER.equals(roleName)) {
+ return AuthorityChecker.getTSStatus(
+ false, "Cannot create role has same name with admin user");
+ }
+ break;
+ case REVOKE_USER:
+ case GRANT_USER:
+ case GRANT_ROLE:
+ case REVOKE_ROLE:
+ if (AuthorityChecker.SUPER_USER.equals(userName)) {
+ return AuthorityChecker.getTSStatus(
+ false, "Cannot grant/revoke privileges of admin user");
+ }
+ break;
+ }
+ return RpcUtils.SUCCESS_STATUS;
+ }
}