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 daece8f4845 set configuration
daece8f4845 is described below

commit daece8f484502935f33bcfc0ac92425f77308d19
Author: shuwenwei <[email protected]>
AuthorDate: Wed Sep 17 17:26:13 2025 +0800

    set configuration
---
 .../org/apache/iotdb/db/auth/AuthorityChecker.java | 34 ++++++++---
 .../iotdb/db/auth/ClusterAuthorityFetcher.java     | 25 +++++++-
 .../apache/iotdb/db/auth/IAuthorityFetcher.java    |  6 +-
 .../execution/config/TableConfigTaskVisitor.java   | 11 +++-
 .../plan/relational/security/AccessControl.java    |  4 ++
 .../relational/security/AccessControlImpl.java     |  9 +++
 .../relational/security/AllowAllAccessControl.java |  7 +++
 .../relational/security/ITableAuthChecker.java     |  5 ++
 .../relational/security/ITableAuthCheckerImpl.java | 15 +++++
 .../security/TreeAccessCheckVisitor.java           | 68 +++++++++++++---------
 .../statement/sys/SetConfigurationStatement.java   | 18 ++++++
 .../conf/iotdb-system.properties.template          |  6 ++
 .../iotdb/commons/conf/ConfigurationFileUtils.java | 36 +++++++++++-
 13 files changed, 203 insertions(+), 41 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java
index 1c4c29c5234..35117bdf34b 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java
@@ -55,6 +55,7 @@ import org.apache.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.tsfile.utils.Binary;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -170,6 +171,14 @@ public class AuthorityChecker {
         : new 
TSStatus(TSStatusCode.NO_PERMISSION.getStatusCode()).setMessage(errMsg);
   }
 
+  public static TSStatus getTSStatus(Collection<PrivilegeType> 
missingPrivileges) {
+    return missingPrivileges.isEmpty()
+        ? SUCCEED
+        : new TSStatus(TSStatusCode.NO_PERMISSION.getStatusCode())
+            .setMessage(
+                NO_PERMISSION_PROMOTION + 
getMissingAllNeededPrivilegeString(missingPrivileges));
+  }
+
   public static TSStatus getTSStatus(boolean hasPermission, PrivilegeType 
neededPrivilege) {
     return hasPermission
         ? SUCCEED
@@ -188,6 +197,14 @@ public class AuthorityChecker {
     return sj.toString();
   }
 
+  private static String 
getMissingAllNeededPrivilegeString(Collection<PrivilegeType> privileges) {
+    StringJoiner sj = new StringJoiner(",");
+    for (PrivilegeType privilege : privileges) {
+      sj.add(privilege.toString());
+    }
+    return sj.toString();
+  }
+
   public static TSStatus getGrantOptTSStatus(
       boolean hasPermission, PrivilegeType neededPrivilege, String database) {
     return hasPermission
@@ -274,7 +291,7 @@ public class AuthorityChecker {
   }
 
   public static boolean checkSystemPermission(String userName, PrivilegeType 
permission) {
-    return authorityFetcher.get().checkUserSysPrivileges(userName, 
permission).getCode()
+    return authorityFetcher.get().checkUserSysPrivilege(userName, 
permission).getCode()
         == TSStatusCode.SUCCESS_STATUS.getStatusCode();
   }
 
@@ -349,24 +366,23 @@ public class AuthorityChecker {
     return authorityFetcher.get().checkRole(username, roleName);
   }
 
-  public static TSStatus checkSuperUserOrMaintain(String userName) {
-    if (AuthorityChecker.SUPER_USER.equals(userName)) {
-      return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
-    }
+  public static TSStatus checkMaintain(String userName) {
     return AuthorityChecker.getTSStatus(
         AuthorityChecker.checkSystemPermission(userName, 
PrivilegeType.MAINTAIN),
         PrivilegeType.MAINTAIN);
   }
 
-  public static TSStatus checkSuperUserOrSystemAdmin(String userName) {
-    if (AuthorityChecker.SUPER_USER.equals(userName)) {
-      return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
-    }
+  public static TSStatus checkUserIsSystemAdmin(String userName) {
     return AuthorityChecker.getTSStatus(
         AuthorityChecker.checkSystemPermission(userName, PrivilegeType.SYSTEM),
         PrivilegeType.SYSTEM);
   }
 
+  public static Collection<PrivilegeType> checkUserHaveSystemPermissions(
+      String userName, Collection<PrivilegeType> permissions) {
+    return authorityFetcher.get().checkUserSysPrivileges(userName, 
permissions);
+  }
+
   public static void buildTSBlock(
       TAuthorizerResp authResp, SettableFuture<ConfigTaskResult> future) {
     List<TSDataType> types = new ArrayList<>();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/ClusterAuthorityFetcher.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/ClusterAuthorityFetcher.java
index 863a3653263..38b840d8215 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/ClusterAuthorityFetcher.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/ClusterAuthorityFetcher.java
@@ -64,8 +64,11 @@ import org.slf4j.LoggerFactory;
 
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.function.BiFunction;
 
 public class ClusterAuthorityFetcher implements IAuthorityFetcher {
@@ -117,7 +120,7 @@ public class ClusterAuthorityFetcher implements 
IAuthorityFetcher {
   }
 
   @Override
-  public TSStatus checkUserSysPrivileges(String username, PrivilegeType 
permission) {
+  public TSStatus checkUserSysPrivilege(String username, PrivilegeType 
permission) {
     checkCacheAvailable();
     return checkPrivilege(
         username,
@@ -127,6 +130,26 @@ public class ClusterAuthorityFetcher implements 
IAuthorityFetcher {
             username, PrivilegeModelType.SYSTEM.ordinal(), 
permission.ordinal(), false));
   }
 
+  @Override
+  public Collection<PrivilegeType> checkUserSysPrivileges(
+      String username, Collection<PrivilegeType> permissions) {
+    checkCacheAvailable();
+    Set<PrivilegeType> missingPrivileges = new HashSet<>();
+    for (PrivilegeType permission : permissions) {
+      TSStatus status =
+          checkPrivilege(
+              username,
+              new PrivilegeUnion(permission, false),
+              (role, union) -> 
role.checkSysPrivilege(union.getPrivilegeType()),
+              new TCheckUserPrivilegesReq(
+                  username, PrivilegeModelType.SYSTEM.ordinal(), 
permission.ordinal(), false));
+      if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+        missingPrivileges.add(permission);
+      }
+    }
+    return missingPrivileges;
+  }
+
   @Override
   public TSStatus checkUserSysPrivilegesGrantOpt(String username, 
PrivilegeType permission) {
     checkCacheAvailable();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/IAuthorityFetcher.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/IAuthorityFetcher.java
index 51b9212cf45..3dc95fa41dc 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/IAuthorityFetcher.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/IAuthorityFetcher.java
@@ -31,6 +31,7 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.sys.AuthorStatement;
 
 import com.google.common.util.concurrent.SettableFuture;
 
+import java.util.Collection;
 import java.util.List;
 
 public interface IAuthorityFetcher {
@@ -45,7 +46,10 @@ public interface IAuthorityFetcher {
   TSStatus checkUserPathPrivilegesGrantOpt(
       String username, List<? extends PartialPath> allPath, PrivilegeType 
permission);
 
-  TSStatus checkUserSysPrivileges(String username, PrivilegeType permissions);
+  TSStatus checkUserSysPrivilege(String username, PrivilegeType permissions);
+
+  Collection<PrivilegeType> checkUserSysPrivileges(
+      String username, Collection<PrivilegeType> permissions);
 
   TSStatus checkUserDBPrivileges(String username, String database, 
PrivilegeType permission);
 
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 5402992563c..212497ef856 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
@@ -234,6 +234,7 @@ import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.utils.Binary;
 import org.apache.tsfile.utils.Pair;
 
+import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
@@ -923,7 +924,15 @@ public class TableConfigTaskVisitor extends 
AstVisitor<IConfigTask, MPPQueryCont
   protected IConfigTask visitSetConfiguration(SetConfiguration node, 
MPPQueryContext context) {
     context.setQueryType(QueryType.WRITE);
     // todo: check all configuration items' privilege requirement
-    return new SetConfigurationTask(((SetConfigurationStatement) 
node.getInnerTreeStatement()));
+    SetConfigurationStatement setConfigurationStatement =
+        (SetConfigurationStatement) node.getInnerTreeStatement();
+    try {
+      accessControl.checkMissingPrivileges(
+          context.getSession().getUserName(), 
setConfigurationStatement.getNeededPrivileges());
+    } catch (IOException e) {
+      throw new AccessDeniedException("Failed to check config item 
permission");
+    }
+    return new SetConfigurationTask(setConfigurationStatement);
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/AccessControl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/AccessControl.java
index e9376a3a7ac..e9a2cb32c89 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/AccessControl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/AccessControl.java
@@ -27,6 +27,8 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.metadata.QualifiedObjectN
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RelationalAuthorStatement;
 import org.apache.iotdb.db.queryengine.plan.statement.Statement;
 
+import java.util.Collection;
+
 public interface AccessControl {
 
   // ====================================== TABLE 
=============================================
@@ -185,6 +187,8 @@ public interface AccessControl {
    */
   boolean hasGlobalPrivilege(String userName, PrivilegeType privilegeType);
 
+  void checkMissingPrivileges(String username, Collection<PrivilegeType> 
privilegeTypes);
+
   // ====================================== TREE 
=============================================
 
   TSStatus checkPermissionBeforeProcess(Statement statement, String userName);
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 ef913ea8f64..3ddd2cd04be 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
@@ -35,6 +35,7 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.sys.AuthorStatement;
 import org.apache.iotdb.db.schemaengine.table.InformationSchemaUtils;
 import org.apache.iotdb.rpc.TSStatusCode;
 
+import java.util.Collection;
 import java.util.Objects;
 
 import static org.apache.iotdb.db.auth.AuthorityChecker.ONLY_ADMIN_ALLOWED;
@@ -403,6 +404,14 @@ public class AccessControlImpl implements AccessControl {
         || AuthorityChecker.checkSystemPermission(userName, privilegeType);
   }
 
+  @Override
+  public void checkMissingPrivileges(String username, 
Collection<PrivilegeType> privilegeTypes) {
+    if (AuthorityChecker.SUPER_USER.equals(username)) {
+      return;
+    }
+    authChecker.checkGlobalPrivileges(username, privilegeTypes);
+  }
+
   @Override
   public TSStatus checkPermissionBeforeProcess(Statement statement, String 
userName) {
     if (AuthorityChecker.SUPER_USER.equals(userName) && !(statement instanceof 
AuthorStatement)) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/AllowAllAccessControl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/AllowAllAccessControl.java
index 9ccb902453d..16f6b011079 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/AllowAllAccessControl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/AllowAllAccessControl.java
@@ -26,6 +26,8 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.metadata.QualifiedObjectN
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RelationalAuthorStatement;
 import org.apache.iotdb.db.queryengine.plan.statement.Statement;
 
+import java.util.Collection;
+
 import static org.apache.iotdb.db.auth.AuthorityChecker.SUCCEED;
 
 public class AllowAllAccessControl implements AccessControl {
@@ -120,6 +122,11 @@ public class AllowAllAccessControl implements 
AccessControl {
     return true;
   }
 
+  @Override
+  public void checkMissingPrivileges(String username, 
Collection<PrivilegeType> privilegeTypes) {
+    // allow anything
+  }
+
   @Override
   public TSStatus checkPermissionBeforeProcess(Statement statement, String 
userName) {
     return SUCCEED;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/ITableAuthChecker.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/ITableAuthChecker.java
index fd6e0c95903..e377fa85fde 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/ITableAuthChecker.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/ITableAuthChecker.java
@@ -19,9 +19,12 @@
 
 package org.apache.iotdb.db.queryengine.plan.relational.security;
 
+import org.apache.iotdb.commons.auth.entity.PrivilegeType;
 import org.apache.iotdb.commons.exception.auth.AccessDeniedException;
 import 
org.apache.iotdb.db.queryengine.plan.relational.metadata.QualifiedObjectName;
 
+import java.util.Collection;
+
 public interface ITableAuthChecker {
 
   /**
@@ -83,6 +86,8 @@ public interface ITableAuthChecker {
    */
   void checkGlobalPrivilege(String userName, TableModelPrivilege privilege);
 
+  void checkGlobalPrivileges(String username, Collection<PrivilegeType> 
privileges);
+
   /**
    * Check if user has the specified global privilege
    *
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/ITableAuthCheckerImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/ITableAuthCheckerImpl.java
index 4ea1995f595..97c4bb2ad99 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/ITableAuthCheckerImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/ITableAuthCheckerImpl.java
@@ -25,6 +25,8 @@ import org.apache.iotdb.db.auth.AuthorityChecker;
 import 
org.apache.iotdb.db.queryengine.plan.relational.metadata.QualifiedObjectName;
 import org.apache.iotdb.rpc.TSStatusCode;
 
+import java.util.Collection;
+
 public class ITableAuthCheckerImpl implements ITableAuthChecker {
 
   @Override
@@ -155,6 +157,19 @@ public class ITableAuthCheckerImpl implements 
ITableAuthChecker {
     }
   }
 
+  @Override
+  public void checkGlobalPrivileges(String username, Collection<PrivilegeType> 
privileges) {
+    if (AuthorityChecker.SUPER_USER.equals(username)) {
+      return;
+    }
+    TSStatus result =
+        AuthorityChecker.getTSStatus(
+            AuthorityChecker.checkUserHaveSystemPermissions(username, 
privileges));
+    if (result.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+      throw new AccessDeniedException(result.getMessage());
+    }
+  }
+
   @Override
   public void checkGlobalPrivilegeGrantOption(String userName, 
TableModelPrivilege privilege) {
     if (AuthorityChecker.SUPER_USER.equals(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 246fc8d3661..6732d3cafd3 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
@@ -125,6 +125,7 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.sys.ClearCacheStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.ExplainAnalyzeStatement;
 import org.apache.iotdb.db.queryengine.plan.statement.sys.FlushStatement;
 import org.apache.iotdb.db.queryengine.plan.statement.sys.KillQueryStatement;
+import 
org.apache.iotdb.db.queryengine.plan.statement.sys.SetConfigurationStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.SetSqlDialectStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.SetSystemStatusStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.ShowCurrentSqlDialectStatement;
@@ -139,6 +140,7 @@ import org.apache.iotdb.rpc.TSStatusCode;
 
 import com.google.common.collect.ImmutableList;
 
+import java.io.IOException;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
@@ -885,35 +887,35 @@ public class TreeAccessCheckVisitor extends 
StatementVisitor<TSStatus, TreeAcces
   @Override
   public TSStatus visitExtendRegion(
       ExtendRegionStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrMaintain(context.userName);
+    return AuthorityChecker.checkMaintain(context.userName);
   }
 
   @Override
   public TSStatus visitGetRegionId(GetRegionIdStatement statement, 
TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrMaintain(context.userName);
+    return AuthorityChecker.checkMaintain(context.userName);
   }
 
   @Override
   public TSStatus visitGetSeriesSlotList(
       GetSeriesSlotListStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrMaintain(context.userName);
+    return AuthorityChecker.checkMaintain(context.userName);
   }
 
   @Override
   public TSStatus visitGetTimeSlotList(
       GetTimeSlotListStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrMaintain(context.userName);
+    return AuthorityChecker.checkMaintain(context.userName);
   }
 
   @Override
   public TSStatus visitCountTimeSlotList(
       CountTimeSlotListStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrMaintain(context.userName);
+    return AuthorityChecker.checkMaintain(context.userName);
   }
 
   @Override
   public TSStatus visitKillQuery(KillQueryStatement statement, 
TreeAccessCheckContext context) {
-    if (AuthorityChecker.checkSuperUserOrMaintain(context.userName).getCode()
+    if (AuthorityChecker.checkMaintain(context.userName).getCode()
         != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
       statement.setAllowedUsername(context.userName);
     }
@@ -922,67 +924,79 @@ public class TreeAccessCheckVisitor extends 
StatementVisitor<TSStatus, TreeAcces
 
   @Override
   public TSStatus visitFlush(FlushStatement flushStatement, 
TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrSystemAdmin(context.userName);
+    return AuthorityChecker.checkUserIsSystemAdmin(context.userName);
+  }
+
+  @Override
+  public TSStatus visitSetConfiguration(
+      SetConfigurationStatement setConfigurationStatement, 
TreeAccessCheckContext context) {
+    try {
+      return AuthorityChecker.getTSStatus(
+          AuthorityChecker.checkUserHaveSystemPermissions(
+              context.userName, 
setConfigurationStatement.getNeededPrivileges()));
+    } catch (IOException e) {
+      return AuthorityChecker.getTSStatus(false, "Failed to check config item 
permission");
+    }
   }
 
   @Override
   public TSStatus visitSetSystemStatus(
       SetSystemStatusStatement setSystemStatusStatement, 
TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrSystemAdmin(context.userName);
+    return AuthorityChecker.checkUserIsSystemAdmin(context.userName);
   }
 
   @Override
   public TSStatus visitStartRepairData(
       StartRepairDataStatement startRepairDataStatement, 
TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrSystemAdmin(context.userName);
+    return AuthorityChecker.checkUserIsSystemAdmin(context.userName);
   }
 
   @Override
   public TSStatus visitStopRepairData(
       StopRepairDataStatement stopRepairDataStatement, TreeAccessCheckContext 
context) {
-    return AuthorityChecker.checkSuperUserOrSystemAdmin(context.userName);
+    return AuthorityChecker.checkUserIsSystemAdmin(context.userName);
   }
 
   @Override
   public TSStatus visitClearCache(
       ClearCacheStatement clearCacheStatement, TreeAccessCheckContext context) 
{
-    return AuthorityChecker.checkSuperUserOrSystemAdmin(context.userName);
+    return AuthorityChecker.checkUserIsSystemAdmin(context.userName);
   }
 
   @Override
   public TSStatus visitMigrateRegion(
       MigrateRegionStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrMaintain(context.userName);
+    return AuthorityChecker.checkMaintain(context.userName);
   }
 
   @Override
   public TSStatus visitReconstructRegion(
       ReconstructRegionStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrMaintain(context.userName);
+    return AuthorityChecker.checkMaintain(context.userName);
   }
 
   @Override
   public TSStatus visitRemoveAINode(
       RemoveAINodeStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrMaintain(context.userName);
+    return AuthorityChecker.checkMaintain(context.userName);
   }
 
   @Override
   public TSStatus visitRemoveConfigNode(
       RemoveConfigNodeStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrMaintain(context.userName);
+    return AuthorityChecker.checkMaintain(context.userName);
   }
 
   @Override
   public TSStatus visitRemoveDataNode(
       RemoveDataNodeStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrMaintain(context.userName);
+    return AuthorityChecker.checkMaintain(context.userName);
   }
 
   @Override
   public TSStatus visitRemoveRegion(
       RemoveRegionStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrMaintain(context.userName);
+    return AuthorityChecker.checkMaintain(context.userName);
   }
 
   @Override
@@ -993,24 +1007,24 @@ public class TreeAccessCheckVisitor extends 
StatementVisitor<TSStatus, TreeAcces
 
   @Override
   public TSStatus visitShowAINodes(ShowAINodesStatement statement, 
TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrMaintain(context.userName);
+    return AuthorityChecker.checkMaintain(context.userName);
   }
 
   @Override
   public TSStatus visitShowClusterId(
       ShowClusterIdStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrMaintain(context.userName);
+    return AuthorityChecker.checkMaintain(context.userName);
   }
 
   @Override
   public TSStatus visitShowCluster(ShowClusterStatement statement, 
TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrMaintain(context.userName);
+    return AuthorityChecker.checkMaintain(context.userName);
   }
 
   @Override
   public TSStatus visitShowConfigNodes(
       ShowConfigNodesStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrMaintain(context.userName);
+    return AuthorityChecker.checkMaintain(context.userName);
   }
 
   @Override
@@ -1028,12 +1042,12 @@ public class TreeAccessCheckVisitor extends 
StatementVisitor<TSStatus, TreeAcces
   @Override
   public TSStatus visitShowDataNodes(
       ShowDataNodesStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrMaintain(context.userName);
+    return AuthorityChecker.checkMaintain(context.userName);
   }
 
   @Override
   public TSStatus visitShowQueries(ShowQueriesStatement statement, 
TreeAccessCheckContext context) {
-    if (AuthorityChecker.checkSuperUserOrMaintain(context.userName).getCode()
+    if (AuthorityChecker.checkMaintain(context.userName).getCode()
         != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
       statement.setAllowedUsername(context.userName);
     }
@@ -1042,24 +1056,24 @@ public class TreeAccessCheckVisitor extends 
StatementVisitor<TSStatus, TreeAcces
 
   @Override
   public TSStatus visitShowRegion(ShowRegionStatement statement, 
TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrMaintain(context.userName);
+    return AuthorityChecker.checkMaintain(context.userName);
   }
 
   @Override
   public TSStatus visitShowVariables(
       ShowVariablesStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrMaintain(context.userName);
+    return AuthorityChecker.checkMaintain(context.userName);
   }
 
   @Override
   public TSStatus visitShowVersion(ShowVersionStatement statement, 
TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrMaintain(context.userName);
+    return AuthorityChecker.checkMaintain(context.userName);
   }
 
   @Override
   public TSStatus visitTestConnection(
       TestConnectionStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkSuperUserOrMaintain(context.userName);
+    return AuthorityChecker.checkMaintain(context.userName);
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/sys/SetConfigurationStatement.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/sys/SetConfigurationStatement.java
index 8f519de0280..12b036aa8f4 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/sys/SetConfigurationStatement.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/sys/SetConfigurationStatement.java
@@ -19,6 +19,8 @@
 
 package org.apache.iotdb.db.queryengine.plan.statement.sys;
 
+import org.apache.iotdb.commons.auth.entity.PrivilegeType;
+import org.apache.iotdb.commons.conf.ConfigurationFileUtils;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.queryengine.plan.analyze.QueryType;
 import org.apache.iotdb.db.queryengine.plan.statement.IConfigStatement;
@@ -26,9 +28,13 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.Statement;
 import org.apache.iotdb.db.queryengine.plan.statement.StatementType;
 import org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor;
 
+import java.io.IOException;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 public class SetConfigurationStatement extends Statement implements 
IConfigStatement {
 
@@ -69,4 +75,16 @@ public class SetConfigurationStatement extends Statement 
implements IConfigState
   public <R, C> R accept(StatementVisitor<R, C> visitor, C context) {
     return visitor.visitSetConfiguration(this, context);
   }
+
+  public Collection<PrivilegeType> getNeededPrivileges() throws IOException {
+    Set<PrivilegeType> neededPrivileges = new HashSet<>();
+    for (String key : this.getConfigItems().keySet()) {
+      PrivilegeType neededPrivilege = 
ConfigurationFileUtils.getConfigurationItemPrivilege(key);
+      if (neededPrivilege == null) {
+        continue;
+      }
+      neededPrivileges.add(neededPrivilege);
+    }
+    return neededPrivileges;
+  }
 }
diff --git 
a/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
 
b/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
index d35a191b97d..c7633fbde5a 100644
--- 
a/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
+++ 
b/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
@@ -441,22 +441,26 @@ dn_metric_internal_reporter_type=MEMORY
 # Whether enable SSL for thrift client connections
 # effectiveMode: restart
 # Datatype: boolean
+# Privilege: SECURITY
 enable_thrift_ssl=false
 
 # Whether enable SSL for Rest Service
 # effectiveMode: restart
 # Datatype: boolean
+# Privilege: SECURITY
 enable_https=false
 
 # SSL key store path
 # linux e.g. /home/iotdb/server.keystore (absolute path) or server.keystore 
(relative path)
 # windows e.g. C:\\iotdb\\server.keystore (absolute path) or server.keystore 
(relative path)
 # effectiveMode: restart
+# Privilege: SECURITY
 key_store_path=
 
 # SSL key store password
 # effectiveMode: restart
 # Datatype: String
+# Privilege: SECURITY
 key_store_pwd=
 
 # SSL trust store path
@@ -1688,10 +1692,12 @@ compressor=LZ4
 # which class to serve for authorization. By default, it is 
LocalFileAuthorizer.
 # Another choice is org.apache.iotdb.commons.auth.authorizer.OpenIdAuthorizer
 # effectiveMode: restart
+# Privilege: SECURITY
 
authorizer_provider_class=org.apache.iotdb.commons.auth.authorizer.LocalFileAuthorizer
 
 # If OpenIdAuthorizer is enabled, then openID_url must be set.
 # effectiveMode: restart
+# Privilege: SECURITY
 openID_url=
 
 # encryption provider class
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/ConfigurationFileUtils.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/ConfigurationFileUtils.java
index e09a376cbbf..b66b4150635 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/ConfigurationFileUtils.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/ConfigurationFileUtils.java
@@ -19,6 +19,8 @@
 
 package org.apache.iotdb.commons.conf;
 
+import org.apache.iotdb.commons.auth.entity.PrivilegeType;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -74,6 +76,7 @@ public class ConfigurationFileUtils {
           .toString();
   private static final String EFFECTIVE_MODE_PREFIX = "effectiveMode:";
   private static final String DATATYPE_PREFIX = "Datatype:";
+  private static final String PRIVILEGE_PREFIX = "Privilege:";
   private static Map<String, DefaultConfigurationItem> 
configuration2DefaultValue;
 
   private static final Map<String, String> lastAppliedProperties = new 
HashMap<>();
@@ -180,6 +183,17 @@ public class ConfigurationFileUtils {
     return defaultConfigurationItem == null ? null : 
defaultConfigurationItem.value;
   }
 
+  public static PrivilegeType getConfigurationItemPrivilege(String 
parameterName)
+      throws IOException {
+    parameterName = parameterName.trim();
+    if (configuration2DefaultValue == null) {
+      loadConfigurationDefaultValueFromTemplate();
+    }
+    DefaultConfigurationItem defaultConfigurationItem =
+        configuration2DefaultValue.get(parameterName);
+    return defaultConfigurationItem == null ? null : 
defaultConfigurationItem.privilege;
+  }
+
   public static void releaseDefault() {
     configuration2DefaultValue = null;
   }
@@ -354,6 +368,7 @@ public class ConfigurationFileUtils {
         BufferedReader reader = new BufferedReader(isr)) {
       List<String> independentLines = new ArrayList<>();
       EffectiveModeType effectiveMode = null;
+      PrivilegeType privilege = null;
       StringBuilder description = new StringBuilder();
       String line;
       while ((line = reader.readLine()) != null) {
@@ -369,6 +384,7 @@ public class ConfigurationFileUtils {
         if (line.isEmpty()) {
           description = new StringBuilder();
           effectiveMode = null;
+          privilege = null;
           independentLines.clear();
           continue;
         }
@@ -386,6 +402,12 @@ public class ConfigurationFileUtils {
           } else if (comment.startsWith(DATATYPE_PREFIX)) {
             independentLines.add(comment);
             continue;
+          } else if (comment.startsWith(PRIVILEGE_PREFIX)) {
+            privilege =
+                PrivilegeType.valueOf(
+                    
comment.substring(PRIVILEGE_PREFIX.length()).trim().toUpperCase());
+            independentLines.add(comment);
+            continue;
           } else {
             description.append(" ");
           }
@@ -406,7 +428,11 @@ public class ConfigurationFileUtils {
           items.put(
               key,
               new DefaultConfigurationItem(
-                  key, value, withDesc ? description.toString().trim() : null, 
effectiveMode));
+                  key,
+                  value,
+                  withDesc ? description.toString().trim() : null,
+                  effectiveMode,
+                  privilege));
         }
       }
     } catch (IOException e) {
@@ -421,13 +447,19 @@ public class ConfigurationFileUtils {
     public String value;
     public String description;
     public EffectiveModeType effectiveMode;
+    public PrivilegeType privilege;
 
     public DefaultConfigurationItem(
-        String name, String value, String description, EffectiveModeType 
effectiveMode) {
+        String name,
+        String value,
+        String description,
+        EffectiveModeType effectiveMode,
+        PrivilegeType privilegeType) {
       this.name = name;
       this.value = value;
       this.description = description;
       this.effectiveMode = effectiveMode == null ? EffectiveModeType.UNKNOWN : 
effectiveMode;
+      this.privilege = privilegeType == null ? PrivilegeType.SYSTEM : 
privilegeType;
     }
   }
 


Reply via email to