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

jackietien pushed a commit to branch rel/1.2
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/rel/1.2 by this push:
     new 9069f4cc4b2 [To rel/1.2] Revert unfinished auth module
9069f4cc4b2 is described below

commit 9069f4cc4b2b576b12422ff27ba3f85cab12619a
Author: Potato <[email protected]>
AuthorDate: Tue Aug 1 14:26:20 2023 +0800

    [To rel/1.2] Revert unfinished auth module
---
 .../confignode/it/IoTDBClusterAuthorityIT.java     |  27 +--
 .../java/org/apache/iotdb/db/it/IoTDBAuthIT.java   | 178 +++++++++--------
 .../db/it/IoTDBSyntaxConventionIdentifierIT.java   |  52 ++++-
 .../java/org/apache/iotdb/db/it/cq/IoTDBCQIT.java  |   4 +-
 .../iotdb/db/it/selectinto/IoTDBSelectIntoIT.java  |  10 +-
 .../db/it/trigger/IoTDBTriggerManagementIT.java    |  14 +-
 .../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4   |   2 -
 .../antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4  | 217 ++++++++++++++++-----
 .../iotdb/confignode/persistence/AuthorInfo.java   |   2 +-
 .../request/ConfigPhysicalPlanSerDeTest.java       |   3 +-
 .../confignode/persistence/AuthorInfoTest.java     |  39 ++--
 .../org/apache/iotdb/db/auth/AuthorityChecker.java | 121 +++++++-----
 .../iotdb/db/auth/ClusterAuthorityFetcher.java     |  12 +-
 .../db/queryengine/plan/parser/ASTVisitor.java     |   6 +
 .../iotdb/db/auth/AuthorizerManagerTest.java       |  12 +-
 .../auth/authorizer/LocalFileAuthorizerTest.java   |  16 +-
 .../iotdb/db/auth/entity/PathPrivilegeTest.java    |   4 +-
 .../org/apache/iotdb/db/auth/entity/RoleTest.java  |   5 +-
 .../org/apache/iotdb/db/auth/entity/UserTest.java  |   6 +-
 .../db/auth/user/LocalFileUserManagerTest.java     |  12 +-
 .../security/encrypt/MessageDigestEncryptTest.java |   2 +-
 .../commons/auth/authorizer/BasicAuthorizer.java   |   2 +-
 .../iotdb/commons/auth/entity/PrivilegeType.java   | 118 +++++------
 .../iotdb/commons/auth/role/BasicRoleManager.java  |   3 +-
 .../iotdb/commons/auth/user/BasicUserManager.java  |  15 +-
 .../iotdb/commons/auth/user/IUserManager.java      |   3 +-
 .../org/apache/iotdb/commons/utils/AuthUtils.java  | 111 +++++++----
 27 files changed, 611 insertions(+), 385 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/confignode/it/IoTDBClusterAuthorityIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/confignode/it/IoTDBClusterAuthorityIT.java
index 30cec1d28a1..dbef8dc24ed 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/confignode/it/IoTDBClusterAuthorityIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/confignode/it/IoTDBClusterAuthorityIT.java
@@ -68,7 +68,8 @@ public class IoTDBClusterAuthorityIT {
     EnvFactory.getEnv().cleanClusterEnvironment();
   }
 
-  private void cleanUserAndRole(IConfigNodeRPCService.Iface client) throws 
TException {
+  private void cleanUserAndRole(IConfigNodeRPCService.Iface client)
+      throws TException, IllegalPathException {
     TSStatus status;
 
     // clean user
@@ -120,13 +121,15 @@ public class IoTDBClusterAuthorityIT {
     TCheckUserPrivilegesReq checkUserPrivilegesReq;
 
     Set<Integer> privilegeList = new HashSet<>();
-    privilegeList.add(PrivilegeType.MANAGE_USER.ordinal());
+    privilegeList.add(PrivilegeType.DELETE_USER.ordinal());
+    privilegeList.add(PrivilegeType.CREATE_USER.ordinal());
 
     Set<Integer> revokePrivilege = new HashSet<>();
-    revokePrivilege.add(PrivilegeType.MANAGE_USER.ordinal());
+    revokePrivilege.add(PrivilegeType.DELETE_USER.ordinal());
 
     List<String> privilege = new ArrayList<>();
-    privilege.add("root.** : MANAGE_USER");
+    privilege.add("root.** : CREATE_USER");
+    privilege.add("root.** : CREATE_USER");
 
     List<PartialPath> paths = new ArrayList<>();
     paths.add(new PartialPath("root.ln.**"));
@@ -156,7 +159,7 @@ public class IoTDBClusterAuthorityIT {
           new TCheckUserPrivilegesReq(
               "tempuser0",
               AuthUtils.serializePartialPathList(paths),
-              PrivilegeType.MANAGE_USER.ordinal());
+              PrivilegeType.DELETE_USER.ordinal());
       status = client.checkUserPrivileges(checkUserPrivilegesReq).getStatus();
       assertEquals(TSStatusCode.NO_PERMISSION.getStatusCode(), 
status.getCode());
 
@@ -267,7 +270,7 @@ public class IoTDBClusterAuthorityIT {
           new TCheckUserPrivilegesReq(
               "tempuser0",
               AuthUtils.serializePartialPathList(paths),
-              PrivilegeType.MANAGE_USER.ordinal());
+              PrivilegeType.DELETE_USER.ordinal());
       status = client.checkUserPrivileges(checkUserPrivilegesReq).getStatus();
       assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), 
status.getCode());
 
@@ -353,7 +356,6 @@ public class IoTDBClusterAuthorityIT {
       authorizerResp = client.queryPermission(authorizerReq);
       status = authorizerResp.getStatus();
       assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), 
status.getCode());
-      privilege.remove(0);
       Assert.assertEquals(
           privilege, 
authorizerResp.getAuthorizerInfo().get(IoTDBConstant.COLUMN_PRIVILEGE));
 
@@ -386,6 +388,7 @@ public class IoTDBClusterAuthorityIT {
       authorizerResp = client.queryPermission(authorizerReq);
       status = authorizerResp.getStatus();
       assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), 
status.getCode());
+      privilege.remove(0);
       assertEquals(
           0, 
authorizerResp.getAuthorizerInfo().get(IoTDBConstant.COLUMN_PRIVILEGE).size());
 
@@ -481,12 +484,10 @@ public class IoTDBClusterAuthorityIT {
       authorizerResp = client.queryPermission(authorizerReq);
       status = authorizerResp.getStatus();
       assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), 
status.getCode());
-      Set<PrivilegeType> allPrivilegeTypes = 
PrivilegeType.ALL.getStorablePrivilege();
-      List<String> resultPrivilegeTypes =
-          
authorizerResp.getAuthorizerInfo().get(IoTDBConstant.COLUMN_PRIVILEGE);
-      Assert.assertEquals(allPrivilegeTypes.size(), 
resultPrivilegeTypes.size());
-      for (int i = 0; i < allPrivilegeTypes.size(); i++) {
-        
Assert.assertTrue(resultPrivilegeTypes.contains(PrivilegeType.values()[i].toString()));
+      for (int i = 0; i < PrivilegeType.values().length; i++) {
+        assertEquals(
+            PrivilegeType.values()[i].toString(),
+            
authorizerResp.getAuthorizerInfo().get(IoTDBConstant.COLUMN_PRIVILEGE).get(i));
       }
     } catch (Exception e) {
       e.printStackTrace();
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBAuthIT.java 
b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBAuthIT.java
index 2df47a3588b..667eca5547c 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBAuthIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBAuthIT.java
@@ -81,7 +81,7 @@ public class IoTDBAuthIT {
             () -> userStmt.execute("INSERT INTO root.a(timestamp, b) VALUES 
(100, 100)"));
         Assert.assertThrows(
             SQLException.class,
-            () -> userStmt.execute("GRANT USER tempuser PRIVILEGES 
WRITE_SCHEMA ON root.a"));
+            () -> userStmt.execute("GRANT USER tempuser PRIVILEGES 
CREATE_TIMESERIES ON root.a"));
 
         adminStmt.execute("GRANT USER tempuser PRIVILEGES ALL on root.**");
 
@@ -89,24 +89,11 @@ public class IoTDBAuthIT {
         userStmt.execute("CREATE TIMESERIES root.a.b WITH 
DATATYPE=INT32,ENCODING=PLAIN");
         userStmt.execute("INSERT INTO root.a(timestamp, b) VALUES (100, 100)");
         userStmt.execute("SELECT * from root.a");
-        userStmt.execute("GRANT USER tempuser PRIVILEGES WRITE_SCHEMA ON 
root.a");
-        userStmt.execute("GRANT USER tempuser PRIVILEGES WRITE_SCHEMA ON 
root.b.b");
+        userStmt.execute("GRANT USER tempuser PRIVILEGES SET_STORAGE_GROUP ON 
root.a");
+        userStmt.execute("GRANT USER tempuser PRIVILEGES CREATE_TIMESERIES ON 
root.b.b");
 
         adminStmt.execute("REVOKE USER tempuser PRIVILEGES ALL on root.**");
-        adminStmt.execute("REVOKE USER tempuser PRIVILEGES WRITE_SCHEMA ON 
root.b.b");
-        adminStmt.execute("GRANT USER tempuser PRIVILEGES WRITE, 
MANAGE_DATABASE on root.**");
-
-        userStmt.execute("CREATE DATABASE root.c");
-        userStmt.execute("CREATE TIMESERIES root.c.d WITH 
DATATYPE=INT32,ENCODING=PLAIN");
-        userStmt.execute("INSERT INTO root.c(timestamp, d) VALUES (100, 100)");
-        userStmt.execute("SELECT * from root.c");
-
-        adminStmt.execute("REVOKE USER tempuser PRIVILEGES WRITE, 
MANAGE_DATABASE on root.**");
-        adminStmt.execute("GRANT USER tempuser PRIVILEGES READ on root.**");
-
-        userStmt.execute("SELECT * from root.c");
-
-        adminStmt.execute("REVOKE USER tempuser PRIVILEGES READ on root.**");
+        adminStmt.execute("REVOKE USER tempuser PRIVILEGES CREATE_TIMESERIES 
ON root.b.b");
 
         Assert.assertThrows(SQLException.class, () -> userStmt.execute("CREATE 
DATABASE root.b"));
         Assert.assertThrows(
@@ -119,7 +106,7 @@ public class IoTDBAuthIT {
         Assert.assertThrows(SQLException.class, () -> userStmt.execute("SELECT 
* from root.a"));
         Assert.assertThrows(
             SQLException.class,
-            () -> userStmt.execute("GRANT USER tempuser PRIVILEGES 
WRITE_SCHEMA ON root.a"));
+            () -> userStmt.execute("GRANT USER tempuser PRIVILEGES 
CREATE_TIMESERIES ON root.a"));
       }
     }
   }
@@ -136,10 +123,20 @@ public class IoTDBAuthIT {
         Assert.assertThrows(
             SQLException.class, () -> userStmt.execute("CREATE DATABASE 
root.sgtest"));
 
-        adminStmt.execute("GRANT USER sgtest PRIVILEGES MANAGE_DATABASE ON 
root.*");
+        adminStmt.execute("GRANT USER sgtest PRIVILEGES CREATE_DATABASE ON 
root.*");
 
         try {
           userStmt.execute("CREATE DATABASE root.sgtest");
+        } catch (SQLException e) {
+          fail(e.getMessage());
+        }
+
+        Assert.assertThrows(
+            SQLException.class, () -> userStmt.execute("DELETE DATABASE 
root.sgtest"));
+
+        adminStmt.execute("GRANT USER sgtest PRIVILEGES DELETE_STORAGE_GROUP 
ON root.*");
+
+        try {
           userStmt.execute("DELETE DATABASE root.sgtest");
         } catch (SQLException e) {
           fail(e.getMessage());
@@ -200,57 +197,65 @@ public class IoTDBAuthIT {
         // grant a non-existing user
         Assert.assertThrows(
             SQLException.class,
-            () -> adminStmt.execute("GRANT USER nulluser PRIVILEGES 
WRITE_SCHEMA on root.a"));
+            () -> adminStmt.execute("GRANT USER nulluser PRIVILEGES 
CREATE_DATABASE on root.a"));
         // grant a non-existing privilege
         Assert.assertThrows(
             SQLException.class,
             () -> adminStmt.execute("GRANT USER tempuser PRIVILEGES 
NOT_A_PRIVILEGE on root.a"));
-        adminStmt.execute("GRANT USER tempuser PRIVILEGES MANAGE_USER on 
root.**");
         // duplicate grant
+        adminStmt.execute("GRANT USER tempuser PRIVILEGES CREATE_USER on 
root.**");
         Assert.assertThrows(
             SQLException.class,
-            () -> adminStmt.execute("GRANT USER tempuser PRIVILEGES 
MANAGE_USER on root.**"));
-        // grant on an illegal seriesPath
+            () -> adminStmt.execute("GRANT USER tempuser PRIVILEGES 
CREATE_USER on root.**"));
+        // grant on a illegal seriesPath
         Assert.assertThrows(
             SQLException.class,
-            () -> adminStmt.execute("GRANT USER tempuser PRIVILEGES 
WRITE_SCHEMA on a.b"));
+            () -> adminStmt.execute("GRANT USER tempuser PRIVILEGES 
DELETE_TIMESERIES on a.b"));
         // grant admin
         Assert.assertThrows(
             SQLException.class,
-            () -> adminStmt.execute("GRANT USER root PRIVILEGES WRITE_SCHEMA 
on root.a.b"));
+            () -> adminStmt.execute("GRANT USER root PRIVILEGES 
DELETE_TIMESERIES on root.a.b"));
         // no privilege to grant
         Assert.assertThrows(
             SQLException.class,
-            () -> userStmt.execute("GRANT USER tempuser PRIVILEGES 
WRITE_SCHEMA on root.a.b"));
+            () -> userStmt.execute("GRANT USER tempuser PRIVILEGES 
DELETE_TIMESERIES on root.a.b"));
         // revoke a non-existing privilege
-        adminStmt.execute("REVOKE USER tempuser PRIVILEGES MANAGE_USER on 
root.**");
+        adminStmt.execute("REVOKE USER tempuser PRIVILEGES CREATE_USER on 
root.**");
         Assert.assertThrows(
             SQLException.class,
-            () -> adminStmt.execute("REVOKE USER tempuser PRIVILEGES 
MANAGE_USER on root.**"));
+            () -> adminStmt.execute("REVOKE USER tempuser PRIVILEGES 
CREATE_USER on root.**"));
         // revoke a non-existing user
         Assert.assertThrows(
             SQLException.class,
-            () -> adminStmt.execute("REVOKE USER tempuser1 PRIVILEGES 
MANAGE_USER on root.**"));
-        // revoke on an illegal seriesPath
+            () -> adminStmt.execute("REVOKE USER tempuser1 PRIVILEGES 
CREATE_USER on root.**"));
+        // revoke on a illegal seriesPath
         Assert.assertThrows(
             SQLException.class,
-            () -> adminStmt.execute("REVOKE USER tempuser PRIVILEGES 
WRITE_SCHEMA on a.b"));
+            () -> adminStmt.execute("REVOKE USER tempuser PRIVILEGES 
DELETE_TIMESERIES on a.b"));
         // revoke admin
         Assert.assertThrows(
             SQLException.class,
-            () -> adminStmt.execute("REVOKE USER root PRIVILEGES WRITE_SCHEMA 
on root.a.b"));
+            () -> adminStmt.execute("REVOKE USER root PRIVILEGES 
DELETE_TIMESERIES on root.a.b"));
         // no privilege to revoke
         Assert.assertThrows(
             SQLException.class,
-            () -> userStmt.execute("REVOKE USER tempuser PRIVILEGES 
WRITE_SCHEMA on root.a.b"));
+            () ->
+                userStmt.execute("REVOKE USER tempuser PRIVILEGES 
DELETE_TIMESERIES on root.a.b"));
         // grant privilege to grant
         Assert.assertThrows(
             SQLException.class,
-            () -> userStmt.execute("GRANT USER tempuser PRIVILEGES 
WRITE_SCHEMA on root.a.b"));
+            () -> userStmt.execute("GRANT USER tempuser PRIVILEGES 
DELETE_TIMESERIES on root.a.b"));
+
+        adminStmt.execute("GRANT USER tempuser PRIVILEGES GRANT_USER_PRIVILEGE 
on root.**");
+        userStmt.execute("GRANT USER tempuser PRIVILEGES DELETE_TIMESERIES on 
root.**");
+
+        // grant privilege to revoke
+        Assert.assertThrows(
+            SQLException.class,
+            () -> userStmt.execute("REVOKE USER tempuser PRIVILEGES 
DELETE_TIMESERIES on root.**"));
 
-        adminStmt.execute("GRANT USER tempuser PRIVILEGES GRANT_PRIVILEGE on 
root.**");
-        userStmt.execute("GRANT USER tempuser PRIVILEGES WRITE_SCHEMA on 
root.**");
-        userStmt.execute("REVOKE USER tempuser PRIVILEGES WRITE_SCHEMA on 
root.**");
+        adminStmt.execute("GRANT USER tempuser PRIVILEGES 
REVOKE_USER_PRIVILEGE on root.**");
+        userStmt.execute("REVOKE USER tempuser PRIVILEGES DELETE_TIMESERIES on 
root.**");
       }
     }
   }
@@ -268,25 +273,23 @@ public class IoTDBAuthIT {
         // grant and revoke the user the privilege to create time series
         Assert.assertThrows(SQLException.class, () -> userStmt.execute("CREATE 
DATABASE root.a"));
 
-        adminStmt.execute("GRANT USER tempuser PRIVILEGES 
MANAGE_DATABASE,WRITE_SCHEMA ON root.a");
+        adminStmt.execute("GRANT USER tempuser PRIVILEGES CREATE_DATABASE ON 
root.a");
         userStmt.execute("CREATE DATABASE root.a");
-        adminStmt.execute("GRANT USER tempuser PRIVILEGES WRITE_SCHEMA ON 
root.a.b");
+        adminStmt.execute("GRANT USER tempuser PRIVILEGES CREATE_TIMESERIES ON 
root.a.b");
         userStmt.execute("CREATE TIMESERIES root.a.b WITH 
DATATYPE=INT32,ENCODING=PLAIN");
         // no privilege to create this one
         Assert.assertThrows(SQLException.class, () -> userStmt.execute("CREATE 
DATABASE root.b"));
         // privilege already exists
         Assert.assertThrows(
             SQLException.class,
-            () ->
-                adminStmt.execute(
-                    "GRANT USER tempuser PRIVILEGES 
MANAGE_DATABASE,WRITE_SCHEMA ON root.a"));
-        // no privilege to create this one anymore
+            () -> adminStmt.execute("GRANT USER tempuser PRIVILEGES 
CREATE_DATABASE ON root.a"));
+        // no privilege to create this one any more
         Assert.assertThrows(SQLException.class, () -> userStmt.execute("CREATE 
DATABASE root.a"));
         // no privilege to create timeseries
         Assert.assertThrows(SQLException.class, () -> userStmt.execute("CREATE 
DATABASE root.a"));
 
-        adminStmt.execute("REVOKE USER tempuser PRIVILEGES 
MANAGE_DATABASE,WRITE_SCHEMA ON root.a");
-        // no privilege to create this one anymore
+        adminStmt.execute("REVOKE USER tempuser PRIVILEGES CREATE_DATABASE ON 
root.a");
+        // no privilege to create this one any more
         Assert.assertThrows(
             SQLException.class,
             () ->
@@ -294,10 +297,11 @@ public class IoTDBAuthIT {
         // privilege already exists
         Assert.assertThrows(
             SQLException.class,
-            () -> adminStmt.execute("GRANT USER tempuser PRIVILEGES 
WRITE_SCHEMA ON root.a.b"));
+            () ->
+                adminStmt.execute("GRANT USER tempuser PRIVILEGES 
CREATE_TIMESERIES ON root.a.b"));
 
-        adminStmt.execute("REVOKE USER tempuser PRIVILEGES WRITE_SCHEMA ON 
root.a.b");
-        // no privilege to create this one anymore
+        adminStmt.execute("REVOKE USER tempuser PRIVILEGES CREATE_TIMESERIES 
ON root.a.b");
+        // no privilege to create this one any more
         Assert.assertThrows(
             SQLException.class,
             () ->
@@ -315,9 +319,9 @@ public class IoTDBAuthIT {
       try (Connection userCon = EnvFactory.getEnv().getConnection("tempuser", 
"temppw");
           Statement userStmt = userCon.createStatement()) {
 
-        adminStmt.execute("GRANT USER tempuser PRIVILEGES MANAGE_DATABASE ON 
root.a");
+        adminStmt.execute("GRANT USER tempuser PRIVILEGES CREATE_DATABASE ON 
root.a");
         userStmt.execute("CREATE DATABASE root.a");
-        adminStmt.execute("GRANT USER tempuser PRIVILEGES WRITE_SCHEMA ON 
root.a.b");
+        adminStmt.execute("GRANT USER tempuser PRIVILEGES CREATE_TIMESERIES ON 
root.a.b");
         userStmt.execute("CREATE TIMESERIES root.a.b WITH 
DATATYPE=INT32,ENCODING=PLAIN");
 
         // grant privilege to insert
@@ -325,25 +329,25 @@ public class IoTDBAuthIT {
             SQLException.class,
             () -> userStmt.execute("INSERT INTO root.a(timestamp, b) VALUES 
(1,100)"));
 
-        adminStmt.execute("GRANT USER tempuser PRIVILEGES WRITE_DATA on 
root.a.**");
+        adminStmt.execute("GRANT USER tempuser PRIVILEGES INSERT_TIMESERIES on 
root.a.**");
         userStmt.execute("INSERT INTO root.a(timestamp, b) VALUES (1,100)");
 
         // revoke privilege to insert
-        adminStmt.execute("REVOKE USER tempuser PRIVILEGES WRITE_DATA on 
root.a.**");
+        adminStmt.execute("REVOKE USER tempuser PRIVILEGES INSERT_TIMESERIES 
on root.a.**");
         Assert.assertThrows(
             SQLException.class,
             () -> userStmt.execute("INSERT INTO root.a(timestamp, b) VALUES 
(1,100)"));
         // grant privilege to query
         Assert.assertThrows(SQLException.class, () -> userStmt.execute("SELECT 
* from root.a"));
 
-        adminStmt.execute("GRANT USER tempuser PRIVILEGES READ_DATA on 
root.**");
+        adminStmt.execute("GRANT USER tempuser PRIVILEGES READ_TIMESERIES on 
root.**");
         ResultSet resultSet = userStmt.executeQuery("SELECT * from root.a");
         resultSet.close();
         resultSet = userStmt.executeQuery("SELECT LAST b from root.a");
         resultSet.close();
 
         // revoke privilege to query
-        adminStmt.execute("REVOKE USER tempuser PRIVILEGES READ_DATA on 
root.**");
+        adminStmt.execute("REVOKE USER tempuser PRIVILEGES READ_TIMESERIES on 
root.**");
         Assert.assertThrows(SQLException.class, () -> userStmt.execute("SELECT 
* from root.a"));
       }
     }
@@ -362,7 +366,7 @@ public class IoTDBAuthIT {
 
         adminStmt.execute("CREATE ROLE admin");
         adminStmt.execute(
-            "GRANT ROLE admin PRIVILEGES 
MANAGE_DATABASE,WRITE_SCHEMA,READ_DATA,WRITE_DATA on root.**");
+            "GRANT ROLE admin PRIVILEGES 
CREATE_DATABASE,CREATE_TIMESERIES,DELETE_TIMESERIES,READ_TIMESERIES,INSERT_TIMESERIES
 on root.**");
         adminStmt.execute("GRANT admin TO tempuser");
 
         userStmt.execute("CREATE DATABASE root.a");
@@ -373,8 +377,13 @@ public class IoTDBAuthIT {
         ResultSet resultSet = userStmt.executeQuery("SELECT * FROM root.**");
         resultSet.close();
 
-        adminStmt.execute("REVOKE ROLE admin PRIVILEGES 
MANAGE_DATABASE,WRITE_SCHEMA on root.**");
-        adminStmt.execute("GRANT USER tempuser PRIVILEGES READ_DATA on 
root.**");
+        adminStmt.execute("REVOKE ROLE admin PRIVILEGES DELETE_TIMESERIES on 
root.**");
+
+        Assert.assertThrows(
+            SQLException.class,
+            () -> userStmt.execute("DELETE FROM root.* WHERE TIME <= 
1000000000"));
+
+        adminStmt.execute("GRANT USER tempuser PRIVILEGES READ_TIMESERIES on 
root.**");
         adminStmt.execute("REVOKE admin FROM tempuser");
         resultSet = userStmt.executeQuery("SELECT * FROM root.**");
         resultSet.close();
@@ -485,35 +494,37 @@ public class IoTDBAuthIT {
 
     try {
       adminStmt.execute("CREATE USER user1 'password1'");
-      adminStmt.execute("GRANT USER user1 PRIVILEGES READ_SCHEMA ON root.a.b");
+      adminStmt.execute("GRANT USER user1 PRIVILEGES READ_TIMESERIES ON 
root.a.b");
       adminStmt.execute("CREATE ROLE role1");
-      adminStmt.execute("GRANT ROLE role1 PRIVILEGES READ_SCHEMA,WRITE_DATA ON 
root.a.b.c");
-      adminStmt.execute("GRANT ROLE role1 PRIVILEGES READ_SCHEMA,WRITE_DATA ON 
root.d.b.c");
+      adminStmt.execute(
+          "GRANT ROLE role1 PRIVILEGES 
READ_TIMESERIES,INSERT_TIMESERIES,DELETE_TIMESERIES ON root.a.b.c");
+      adminStmt.execute(
+          "GRANT ROLE role1 PRIVILEGES 
READ_TIMESERIES,INSERT_TIMESERIES,DELETE_TIMESERIES ON root.d.b.c");
       adminStmt.execute("GRANT role1 TO user1");
 
       ResultSet resultSet = adminStmt.executeQuery("LIST PRIVILEGES USER 
user1");
       String ans =
-          ",root.a.b : READ_SCHEMA"
+          ",root.a.b : READ_TIMESERIES"
               + ",\n"
-              + "role1,root.a.b.c : READ_DATA WRITE_DATA READ_SCHEMA"
+              + "role1,root.a.b.c : INSERT_TIMESERIES READ_TIMESERIES 
DELETE_TIMESERIES"
               + ",\n"
-              + "role1,root.d.b.c : READ_DATA WRITE_DATA READ_SCHEMA"
+              + "role1,root.d.b.c : INSERT_TIMESERIES READ_TIMESERIES 
DELETE_TIMESERIES"
               + ",\n";
       try {
         validateResultSet(resultSet, ans);
 
         resultSet = adminStmt.executeQuery("LIST PRIVILEGES USER user1 ON 
root.a.b.c");
-        ans = "role1,root.a.b.c : READ_DATA WRITE_DATA READ_SCHEMA,\n";
+        ans = "role1,root.a.b.c : INSERT_TIMESERIES READ_TIMESERIES 
DELETE_TIMESERIES,\n";
         validateResultSet(resultSet, ans);
 
         adminStmt.execute("REVOKE role1 from user1");
 
         resultSet = adminStmt.executeQuery("LIST PRIVILEGES USER user1");
-        ans = ",root.a.b : READ_SCHEMA,\n";
+        ans = ",root.a.b : READ_TIMESERIES,\n";
         validateResultSet(resultSet, ans);
 
         resultSet = adminStmt.executeQuery("LIST PRIVILEGES USER user1 ON 
root.a.**");
-        ans = ",root.a.b : READ_SCHEMA,\n";
+        ans = ",root.a.b : READ_TIMESERIES,\n";
         validateResultSet(resultSet, ans);
       } finally {
         resultSet.close();
@@ -537,26 +548,31 @@ public class IoTDBAuthIT {
         // not granted list role privilege, should return empty
         validateResultSet(resultSet, ans);
 
-        adminStmt.execute("GRANT ROLE role1 PRIVILEGES READ_SCHEMA,WRITE_DATA 
ON root.a.b.c");
-        adminStmt.execute("GRANT ROLE role1 PRIVILEGES READ_SCHEMA,WRITE_DATA 
ON root.d.b.c");
+        adminStmt.execute(
+            "GRANT ROLE role1 PRIVILEGES 
READ_TIMESERIES,INSERT_TIMESERIES,DELETE_TIMESERIES ON root.a.b.c");
+        adminStmt.execute(
+            "GRANT ROLE role1 PRIVILEGES 
READ_TIMESERIES,INSERT_TIMESERIES,DELETE_TIMESERIES ON root.d.b.c");
         resultSet = adminStmt.executeQuery("LIST PRIVILEGES ROLE role1");
         ans =
-            "root.a.b.c : READ_DATA WRITE_DATA READ_SCHEMA,\n"
-                + "root.d.b.c : READ_DATA WRITE_DATA READ_SCHEMA,\n";
+            "root.a.b.c : INSERT_TIMESERIES READ_TIMESERIES 
DELETE_TIMESERIES,\n"
+                + "root.d.b.c : INSERT_TIMESERIES READ_TIMESERIES 
DELETE_TIMESERIES,\n";
         validateResultSet(resultSet, ans);
 
         resultSet = adminStmt.executeQuery("LIST PRIVILEGES ROLE role1 ON 
root.a.b.c");
-        ans = "root.a.b.c : READ_DATA WRITE_DATA READ_SCHEMA,\n";
+        ans = "root.a.b.c : INSERT_TIMESERIES READ_TIMESERIES 
DELETE_TIMESERIES,\n";
         validateResultSet(resultSet, ans);
 
-        adminStmt.execute("REVOKE ROLE role1 PRIVILEGES READ_SCHEMA,WRITE_DATA 
ON root.a.b.c");
+        adminStmt.execute(
+            "REVOKE ROLE role1 PRIVILEGES INSERT_TIMESERIES,DELETE_TIMESERIES 
ON root.a.b.c");
 
         resultSet = adminStmt.executeQuery("LIST PRIVILEGES ROLE role1");
-        ans = "root.d.b.c : READ_DATA WRITE_DATA READ_SCHEMA,\n";
+        ans =
+            "root.a.b.c : READ_TIMESERIES,\n"
+                + "root.d.b.c : INSERT_TIMESERIES READ_TIMESERIES 
DELETE_TIMESERIES,\n";
         validateResultSet(resultSet, ans);
 
         resultSet = adminStmt.executeQuery("LIST PRIVILEGES ROLE role1 ON 
root.a.b.c");
-        ans = "";
+        ans = "root.a.b.c : READ_TIMESERIES,\n";
         validateResultSet(resultSet, ans);
       } finally {
         resultSet.close();
@@ -635,10 +651,10 @@ public class IoTDBAuthIT {
       };
 
       for (int i = 0; i < members.length - 1; i++) {
-        adminStmt.execute("CREATE USER " + members[i] + " 'a666666'");
+        adminStmt.execute("CREATE USER " + members[i] + " '666666'");
         adminStmt.execute("GRANT dalao TO  " + members[i]);
       }
-      adminStmt.execute("CREATE USER RiverSky 'a2333333'");
+      adminStmt.execute("CREATE USER RiverSky '2333333'");
       adminStmt.execute("GRANT zhazha TO RiverSky");
 
       ResultSet resultSet = adminStmt.executeQuery("LIST USER OF ROLE dalao");
@@ -718,7 +734,7 @@ public class IoTDBAuthIT {
       try {
         Assert.assertThrows(SQLException.class, () -> userStmt.execute("LIST 
USER"));
         // with list user privilege
-        adminStmt.execute("GRANT USER tempuser PRIVILEGES MANAGE_USER on 
root.**");
+        adminStmt.execute("GRANT USER tempuser PRIVILEGES LIST_USER on 
root.**");
         ResultSet resultSet = userStmt.executeQuery("LIST USER");
         String ans =
             "root,\n"
@@ -761,7 +777,7 @@ public class IoTDBAuthIT {
     try (Connection adminCon = EnvFactory.getEnv().getConnection();
         Statement adminStmt = adminCon.createStatement()) {
       adminStmt.execute("CREATE USER tempuser 'temppw'");
-      adminStmt.execute("GRANT USER tempuser PRIVILEGES WRITE_DATA on 
root.sg1.**");
+      adminStmt.execute("GRANT USER tempuser PRIVILEGES INSERT_TIMESERIES on 
root.sg1.**");
 
       try (Connection userCon = EnvFactory.getEnv().getConnection("tempuser", 
"temppw");
           Statement userStatement = userCon.createStatement()) {
@@ -798,7 +814,8 @@ public class IoTDBAuthIT {
         Statement adminStatement = adminConnection.createStatement()) {
       adminStatement.execute("CREATE USER a_application 'a_application'");
       adminStatement.execute("CREATE ROLE application_role");
-      adminStatement.execute("GRANT ROLE application_role PRIVILEGES READ_DATA 
ON root.test.**");
+      adminStatement.execute(
+          "GRANT ROLE application_role PRIVILEGES READ_TIMESERIES ON 
root.test.**");
       adminStatement.execute("GRANT application_role TO a_application");
 
       adminStatement.execute("INSERT INTO root.test(time, s1, s2, s3) 
VALUES(1, 2, 3, 4)");
@@ -822,7 +839,8 @@ public class IoTDBAuthIT {
       adminStatement.execute("CREATE USER user01 'pass1234'");
       adminStatement.execute("CREATE USER user02 'pass1234'");
       adminStatement.execute("CREATE ROLE manager");
-      adminStatement.execute("GRANT USER user01 PRIVILEGES GRANT_PRIVILEGE on 
root.**");
+      adminStatement.execute("GRANT USER user01 PRIVILEGES GRANT_USER_ROLE on 
root.**");
+      adminStatement.execute("GRANT USER user01 PRIVILEGES REVOKE_USER_ROLE on 
root.**");
     }
 
     try (Connection userCon = EnvFactory.getEnv().getConnection("user01", 
"pass1234");
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBSyntaxConventionIdentifierIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBSyntaxConventionIdentifierIT.java
index 54cde136ec8..132acdcb51d 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBSyntaxConventionIdentifierIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBSyntaxConventionIdentifierIT.java
@@ -603,10 +603,32 @@ public class IoTDBSyntaxConventionIdentifierIT {
   public void testUserName() {
     try (Connection connection = EnvFactory.getEnv().getConnection();
         Statement statement = connection.createStatement()) {
-      String[] userNames = new String[] {"userid", "userid0", "user_id", 
"user0id", "`a22233`"};
+      String[] userNames =
+          new String[] {
+            "userid",
+            "userid0",
+            "user_id",
+            "user0id",
+            "`22233`",
+            "`userab!`",
+            "`user'ab'`",
+            "`usera.b`",
+            "`usera``b`"
+          };
 
       String[] resultNames =
-          new String[] {"root", "userid", "userid0", "user_id", "user0id", 
"a22233"};
+          new String[] {
+            "root",
+            "userid",
+            "userid0",
+            "user_id",
+            "user0id",
+            "22233",
+            "userab!",
+            "user'ab'",
+            "usera.b",
+            "usera`b"
+          };
 
       String createUsersSql = "create user %s 'pwd123' ";
       for (String userName : userNames) {
@@ -668,9 +690,31 @@ public class IoTDBSyntaxConventionIdentifierIT {
   public void testRoleName() {
     try (Connection connection = EnvFactory.getEnv().getConnection();
         Statement statement = connection.createStatement()) {
-      String[] roleNames = new String[] {"roleid", "roleid0", "role_id", 
"role0id", "`a22233`"};
+      String[] roleNames =
+          new String[] {
+            "roleid",
+            "roleid0",
+            "role_id",
+            "role0id",
+            "`22233`",
+            "`roleab!`",
+            "`role'ab'`",
+            "`rolea.b`",
+            "`rolea``b`"
+          };
 
-      String[] resultNames = new String[] {"roleid", "roleid0", "role_id", 
"role0id", "a22233"};
+      String[] resultNames =
+          new String[] {
+            "roleid",
+            "roleid0",
+            "role_id",
+            "role0id",
+            "22233",
+            "roleab!",
+            "role'ab'",
+            "rolea.b",
+            "rolea`b"
+          };
       String createRolesSql = "create role %s";
       for (String roleName : roleNames) {
         statement.execute(String.format(createRolesSql, roleName));
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/cq/IoTDBCQIT.java 
b/integration-test/src/test/java/org/apache/iotdb/db/it/cq/IoTDBCQIT.java
index 1b858d70dd8..dc2254149e8 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/cq/IoTDBCQIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/cq/IoTDBCQIT.java
@@ -541,11 +541,11 @@ public class IoTDBCQIT {
         } catch (Exception e) {
           assertEquals(
               TSStatusCode.NO_PERMISSION.getStatusCode()
-                  + ": No permissions for this operation, please add privilege 
USE_CQ",
+                  + ": No permissions for this operation, please add privilege 
SHOW_CONTINUOUS_QUERIES",
               e.getMessage());
         }
 
-        statement.execute("GRANT USER `zmty` PRIVILEGES USE_CQ");
+        statement.execute("GRANT USER `zmty` PRIVILEGES 
SHOW_CONTINUOUS_QUERIES");
 
         try (ResultSet resultSet = statement2.executeQuery("show CQS")) {
 
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/selectinto/IoTDBSelectIntoIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/selectinto/IoTDBSelectIntoIT.java
index 16b0ca64fe0..917949ab266 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/selectinto/IoTDBSelectIntoIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/selectinto/IoTDBSelectIntoIT.java
@@ -551,7 +551,7 @@ public class IoTDBSelectIntoIT {
     try (Connection adminCon = EnvFactory.getEnv().getConnection();
         Statement adminStmt = adminCon.createStatement()) {
       adminStmt.execute("CREATE USER tempuser1 'temppw1'");
-      adminStmt.execute("GRANT USER tempuser1 PRIVILEGES WRITE_DATA on 
root.sg_bk.**;");
+      adminStmt.execute("GRANT USER tempuser1 PRIVILEGES INSERT_TIMESERIES on 
root.sg_bk.**;");
 
       try (Connection userCon = EnvFactory.getEnv().getConnection("tempuser1", 
"temppw1");
           Statement userStmt = userCon.createStatement()) {
@@ -562,7 +562,8 @@ public class IoTDBSelectIntoIT {
         Assert.assertTrue(
             e.getMessage(),
             e.getMessage()
-                .contains("No permissions for this operation, please add 
privilege READ_DATA"));
+                .contains(
+                    "No permissions for this operation, please add privilege 
READ_TIMESERIES"));
       }
     }
   }
@@ -572,7 +573,7 @@ public class IoTDBSelectIntoIT {
     try (Connection adminCon = EnvFactory.getEnv().getConnection();
         Statement adminStmt = adminCon.createStatement()) {
       adminStmt.execute("CREATE USER tempuser2 'temppw2'");
-      adminStmt.execute("GRANT USER tempuser2 PRIVILEGES WRITE_DATA on 
root.sg.**;");
+      adminStmt.execute("GRANT USER tempuser2 PRIVILEGES READ_TIMESERIES on 
root.sg.**;");
 
       try (Connection userCon = EnvFactory.getEnv().getConnection("tempuser2", 
"temppw2");
           Statement userStmt = userCon.createStatement()) {
@@ -583,7 +584,8 @@ public class IoTDBSelectIntoIT {
         Assert.assertTrue(
             e.getMessage(),
             e.getMessage()
-                .contains("No permissions for this operation, please add 
privilege WRITE_DATA"));
+                .contains(
+                    "No permissions for this operation, please add privilege 
INSERT_TIMESERIES"));
       }
     }
   }
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/trigger/IoTDBTriggerManagementIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/trigger/IoTDBTriggerManagementIT.java
index 8b04523b6b8..00a2530d8ca 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/trigger/IoTDBTriggerManagementIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/trigger/IoTDBTriggerManagementIT.java
@@ -546,11 +546,11 @@ public class IoTDBTriggerManagementIT {
         } catch (Exception e) {
           assertEquals(
               TSStatusCode.NO_PERMISSION.getStatusCode()
-                  + ": No permissions for this operation, please add privilege 
USE_TRIGGER",
+                  + ": No permissions for this operation, please add privilege 
CREATE_TRIGGER",
               e.getMessage());
         }
 
-        statement.execute("GRANT USER `zmty` PRIVILEGES USE_TRIGGER on 
root.test.stateless.a");
+        statement.execute("GRANT USER `zmty` PRIVILEGES CREATE_TRIGGER on 
root.test.stateless.a");
 
         try {
           statement2.execute(
@@ -576,7 +576,7 @@ public class IoTDBTriggerManagementIT {
         } catch (Exception e) {
           assertEquals(
               TSStatusCode.NO_PERMISSION.getStatusCode()
-                  + ": No permissions for this operation, please add privilege 
USE_TRIGGER",
+                  + ": No permissions for this operation, please add privilege 
CREATE_TRIGGER",
               e.getMessage());
         }
       }
@@ -608,11 +608,11 @@ public class IoTDBTriggerManagementIT {
         } catch (Exception e) {
           assertEquals(
               TSStatusCode.NO_PERMISSION.getStatusCode()
-                  + ": No permissions for this operation, please add privilege 
USE_TRIGGER",
+                  + ": No permissions for this operation, please add privilege 
DROP_TRIGGER",
               e.getMessage());
         }
 
-        statement.execute("GRANT USER `zmty` PRIVILEGES USE_TRIGGER on 
root.test.stateless.b");
+        statement.execute("GRANT USER `zmty` PRIVILEGES CREATE_TRIGGER on 
root.test.stateless.b");
 
         try {
           statement2.execute("drop trigger " + 
STATELESS_TRIGGER_BEFORE_INSERTION_PREFIX + "a");
@@ -620,11 +620,11 @@ public class IoTDBTriggerManagementIT {
         } catch (Exception e) {
           assertEquals(
               TSStatusCode.NO_PERMISSION.getStatusCode()
-                  + ": No permissions for this operation, please add privilege 
USE_TRIGGER",
+                  + ": No permissions for this operation, please add privilege 
DROP_TRIGGER",
               e.getMessage());
         }
 
-        statement.execute("GRANT USER `zmty` PRIVILEGES USE_TRIGGER on 
root.test.stateless.a");
+        statement.execute("GRANT USER `zmty` PRIVILEGES DROP_TRIGGER on 
root.test.stateless.a");
 
         try {
           statement2.execute("drop trigger " + 
STATELESS_TRIGGER_BEFORE_INSERTION_PREFIX + "a");
diff --git 
a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 
b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
index c9d66ee181e..c26fe66aa5b 100644
--- 
a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
+++ 
b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
@@ -910,8 +910,6 @@ privileges
 
 privilegeValue
     : ALL
-    | READ
-    | WRITE
     | PRIVILEGE_VALUE
     ;
 
diff --git 
a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 
b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4
index 0d66cbc8033..ed4d8884943 100644
--- a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4
+++ b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4
@@ -61,14 +61,6 @@ ALL
     : A L L
     ;
 
-READ
-    : R E A D
-    ;
-
-WRITE
-    : W R I T E
-    ;
-
 ALTER
     : A L T E R
     ;
@@ -905,70 +897,140 @@ ELSE
 // Privileges Keywords
 
 PRIVILEGE_VALUE
-    : READ_DATA
-    | WRITE_DATA
-    | READ_SCHEMA
-    | WRITE_SCHEMA
-    | MANAGE_USER
-    | MANAGE_ROLE
-    | GRANT_PRIVILEGE
-    | ALTER_PASSWORD
-    | USE_TRIGGER
-    | USE_CQ
-    | USE_PIPE
-    | MANAGE_DATABASE
+    : SET_STORAGE_GROUP | DELETE_STORAGE_GROUP | CREATE_DATABASE | 
DELETE_DATABASE
+    | CREATE_TIMESERIES | INSERT_TIMESERIES | READ_TIMESERIES | 
DELETE_TIMESERIES | ALTER_TIMESERIES
+    | CREATE_USER | DELETE_USER | MODIFY_PASSWORD | LIST_USER
+    | GRANT_USER_PRIVILEGE | REVOKE_USER_PRIVILEGE | GRANT_USER_ROLE | 
REVOKE_USER_ROLE
+    | CREATE_ROLE | DELETE_ROLE | LIST_ROLE | GRANT_ROLE_PRIVILEGE | 
REVOKE_ROLE_PRIVILEGE
+    | CREATE_FUNCTION | DROP_FUNCTION | CREATE_TRIGGER | DROP_TRIGGER | 
START_TRIGGER | STOP_TRIGGER
+    | CREATE_CONTINUOUS_QUERY | DROP_CONTINUOUS_QUERY | SHOW_CONTINUOUS_QUERIES
+    | APPLY_TEMPLATE | UPDATE_TEMPLATE | READ_TEMPLATE | 
READ_TEMPLATE_APPLICATION
+    | CREATE_PIPEPLUGIN | DROP_PIPEPLUGIN | SHOW_PIPEPLUGINS | CREATE_PIPE | 
START_PIPE | STOP_PIPE | DROP_PIPE | SHOW_PIPES
+    | CREATE_VIEW | ALTER_VIEW | RENAME_VIEW | DELETE_VIEW
+    ;
+
+SET_STORAGE_GROUP
+    : S E T '_' S T O R A G E '_' G R O U P
     ;
 
-READ_DATA
-    : R E A D '_' D A T A
+DELETE_STORAGE_GROUP
+    : D E L E T E '_' S T O R A G E '_' G R O U P
     ;
 
-WRITE_DATA
-    : W R I T E '_' D A T A
+CREATE_DATABASE
+    : C R E A T E '_' D A T A B A S E
     ;
 
-READ_SCHEMA
-    : R E A D '_' S C H E M A
+DELETE_DATABASE
+    : D E L E T E '_' D A T A B A S E
     ;
 
-WRITE_SCHEMA
-    : W R I T E '_' S C H E M A
+CREATE_TIMESERIES
+    : C R E A T E '_' T I M E S E R I E S
     ;
 
-MANAGE_USER
-    : M A N A G E '_' U S E R
+INSERT_TIMESERIES
+    : I N S E R T '_' T I M E S E R I E S
     ;
 
-MANAGE_ROLE
-    : M A N A G E '_' R O L E
+READ_TIMESERIES
+    : R E A D '_' T I M E S E R I E S
     ;
 
-GRANT_PRIVILEGE
-    : G R A N T '_' P R I V I L E G E
+DELETE_TIMESERIES
+    : D E L E T E '_' T I M E S E R I E S
     ;
 
-ALTER_PASSWORD
-    : A L T E R '_' P A S S W O R D
+ALTER_TIMESERIES
+    : A L T E R '_' T I M E S E R I E S
     ;
 
-USE_TRIGGER
-    : U S E '_' T R I G G E R
+CREATE_USER
+    : C R E A T E '_' U S E R
     ;
 
-USE_CQ
-    : U S E '_' C Q
+DELETE_USER
+    : D E L E T E '_' U S E R
     ;
 
-USE_PIPE
-    : U S E '_' P I P E
+MODIFY_PASSWORD
+    : M O D I F Y '_' P A S S W O R D
     ;
 
-MANAGE_DATABASE
-    : M A N A G E '_' D A T A B A S E
+LIST_USER
+    : L I S T '_' U S E R
     ;
 
-SET_STORAGE_GROUP
-    : S E T '_' S T O R A G E '_' G R O U P
+GRANT_USER_PRIVILEGE
+    : G R A N T '_' U S E R '_' P R I V I L E G E
+    ;
+
+REVOKE_USER_PRIVILEGE
+    : R E V O K E '_' U S E R '_' P R I V I L E G E
+    ;
+
+GRANT_USER_ROLE
+    : G R A N T '_' U S E R '_' R O L E
+    ;
+
+REVOKE_USER_ROLE
+    : R E V O K E '_' U S E R '_' R O L E
+    ;
+
+CREATE_ROLE
+    : C R E A T E '_' R O L E
+    ;
+
+DELETE_ROLE
+    : D E L E T E '_' R O L E
+    ;
+
+LIST_ROLE
+    : L I S T '_' R O L E
+    ;
+
+GRANT_ROLE_PRIVILEGE
+    : G R A N T '_' R O L E '_' P R I V I L E G E
+    ;
+
+REVOKE_ROLE_PRIVILEGE
+    : R E V O K E '_' R O L E '_' P R I V I L E G E
+    ;
+
+CREATE_FUNCTION
+    : C R E A T E '_' F U N C T I O N
+    ;
+
+DROP_FUNCTION
+    : D R O P '_' F U N C T I O N
+    ;
+
+CREATE_TRIGGER
+    : C R E A T E '_' T R I G G E R
+    ;
+
+DROP_TRIGGER
+    : D R O P '_' T R I G G E R
+    ;
+
+START_TRIGGER
+    : S T A R T '_' T R I G G E R
+    ;
+
+STOP_TRIGGER
+    : S T O P '_' T R I G G E R
+    ;
+
+CREATE_CONTINUOUS_QUERY
+    : C R E A T E '_' C O N T I N U O U S '_' Q U E R Y
+    ;
+
+DROP_CONTINUOUS_QUERY
+    : D R O P '_' C O N T I N U O U S '_' Q U E R Y
+    ;
+
+SHOW_CONTINUOUS_QUERIES
+    : S H O W '_' C O N T I N U O U S '_' Q U E R I E S
     ;
 
 SCHEMA_REPLICATION_FACTOR
@@ -991,6 +1053,69 @@ DATA_REGION_GROUP_NUM
     : D A T A '_' R E G I O N '_' G R O U P '_' N U M
     ;
 
+APPLY_TEMPLATE
+    : A P P L Y '_' T E M P L A T E
+    ;
+
+UPDATE_TEMPLATE
+    : U P D A T E '_' T E M P L A T E
+    ;
+
+READ_TEMPLATE
+    : R E A D '_' T E M P L A T E
+    ;
+
+READ_TEMPLATE_APPLICATION
+    : R E A D '_' T E M P L A T E '_' A P P L I C A T I O N
+    ;
+
+CREATE_PIPEPLUGIN
+    : C R E A T E '_' P I P E P L U G I N
+    ;
+
+DROP_PIPEPLUGIN
+    : D R O P '_' P I P E P L U G I N
+    ;
+
+SHOW_PIPEPLUGINS
+    : S H O W '_' P I P E P L U G I N S
+    ;
+CREATE_PIPE
+    : C R E A T E '_' P I P E
+    ;
+
+START_PIPE
+    : S T A R T '_' P I P E
+    ;
+
+STOP_PIPE
+    : S T O P '_' P I P E
+    ;
+
+DROP_PIPE
+    : D R O P '_' P I P E
+    ;
+
+SHOW_PIPES
+    : S H O W '_' P I P E S
+    ;
+
+CREATE_VIEW
+    : C R E A T E '_' V I E W
+    ;
+
+ALTER_VIEW
+    : A L T E R '_' V I E W
+    ;
+
+RENAME_VIEW
+    : R E N A M E '_' V I E W
+    ;
+
+DELETE_VIEW
+    : D E L E T E '_' V I E W
+    ;
+
 /**
  * 3. Operators
  */
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/AuthorInfo.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/AuthorInfo.java
index 22b04d9cc0d..2c1ce580110 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/AuthorInfo.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/AuthorInfo.java
@@ -314,7 +314,7 @@ public class AuthorInfo implements SnapshotProcessor {
     List<String> userPrivilegesList = new ArrayList<>();
 
     if (IoTDBConstant.PATH_ROOT.equals(plan.getUserName())) {
-      for (PrivilegeType privilegeType : 
PrivilegeType.ALL.getStorablePrivilege()) {
+      for (PrivilegeType privilegeType : PrivilegeType.values()) {
         userPrivilegesList.add(privilegeType.toString());
       }
     } else {
diff --git 
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java
 
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java
index f30d46dd117..b09b65d5085 100644
--- 
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java
+++ 
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java
@@ -540,7 +540,8 @@ public class ConfigPhysicalPlanSerDeTest {
     AuthorPlan req0;
     AuthorPlan req1;
     Set<Integer> permissions = new HashSet<>();
-    permissions.add(PrivilegeType.GRANT_PRIVILEGE.ordinal());
+    permissions.add(PrivilegeType.GRANT_USER_PRIVILEGE.ordinal());
+    permissions.add(PrivilegeType.REVOKE_USER_ROLE.ordinal());
 
     // create user
     req0 =
diff --git 
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/AuthorInfoTest.java
 
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/AuthorInfoTest.java
index 04412c3a252..ff5b2f337a2 100644
--- 
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/AuthorInfoTest.java
+++ 
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/AuthorInfoTest.java
@@ -89,13 +89,16 @@ public class AuthorInfoTest {
     TCheckUserPrivilegesReq checkUserPrivilegesReq;
 
     Set<Integer> privilegeList = new HashSet<>();
-    privilegeList.add(PrivilegeType.MANAGE_USER.ordinal());
+    privilegeList.add(PrivilegeType.DELETE_USER.ordinal());
+    privilegeList.add(PrivilegeType.CREATE_USER.ordinal());
 
     Set<Integer> revokePrivilege = new HashSet<>();
-    revokePrivilege.add(PrivilegeType.MANAGE_USER.ordinal());
+    revokePrivilege.add(PrivilegeType.DELETE_USER.ordinal());
 
+    Map<String, List<String>> permissionInfo;
     List<String> privilege = new ArrayList<>();
-    privilege.add("root.** : MANAGE_USER");
+    privilege.add("root.** : CREATE_USER");
+    privilege.add("root.** : CREATE_USER");
 
     List<PartialPath> paths = new ArrayList<>();
     paths.add(new PartialPath("root.ln"));
@@ -122,7 +125,7 @@ public class AuthorInfoTest {
     // check user privileges
     status =
         authorInfo
-            .checkUserPrivileges("user0", paths, 
PrivilegeType.MANAGE_USER.ordinal())
+            .checkUserPrivileges("user0", paths, 
PrivilegeType.DELETE_USER.ordinal())
             .getStatus();
     Assert.assertEquals(TSStatusCode.NO_PERMISSION.getStatusCode(), 
status.getCode());
 
@@ -215,7 +218,7 @@ public class AuthorInfoTest {
     // check user privileges
     status =
         authorInfo
-            .checkUserPrivileges("user0", paths, 
PrivilegeType.MANAGE_USER.ordinal())
+            .checkUserPrivileges("user0", paths, 
PrivilegeType.DELETE_USER.ordinal())
             .getStatus();
     Assert.assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), 
status.getCode());
 
@@ -282,7 +285,6 @@ public class AuthorInfoTest {
     permissionInfoResp = authorInfo.executeListUserPrivileges(authorPlan);
     status = permissionInfoResp.getStatus();
     Assert.assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), 
status.getCode());
-    privilege.remove(0);
     Assert.assertEquals(
         privilege, 
permissionInfoResp.getPermissionInfo().get(IoTDBConstant.COLUMN_PRIVILEGE));
 
@@ -315,6 +317,7 @@ public class AuthorInfoTest {
     permissionInfoResp = authorInfo.executeListRolePrivileges(authorPlan);
     status = permissionInfoResp.getStatus();
     Assert.assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), 
status.getCode());
+    privilege.remove(0);
     Assert.assertEquals(
         0, 
permissionInfoResp.getPermissionInfo().get(IoTDBConstant.COLUMN_PRIVILEGE).size());
 
@@ -411,12 +414,10 @@ public class AuthorInfoTest {
     permissionInfoResp = authorInfo.executeListUserPrivileges(authorPlan);
     status = permissionInfoResp.getStatus();
     Assert.assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), 
status.getCode());
-    Set<PrivilegeType> allPrivilegeTypes = 
PrivilegeType.ALL.getStorablePrivilege();
-    List<String> resultPrivilegeTypes =
-        
permissionInfoResp.getPermissionInfo().get(IoTDBConstant.COLUMN_PRIVILEGE);
-    Assert.assertEquals(allPrivilegeTypes.size(), resultPrivilegeTypes.size());
-    for (int i = 0; i < allPrivilegeTypes.size(); i++) {
-      
Assert.assertTrue(resultPrivilegeTypes.contains(PrivilegeType.values()[i].toString()));
+    for (int i = 0; i < PrivilegeType.values().length; i++) {
+      Assert.assertEquals(
+          PrivilegeType.values()[i].toString(),
+          
permissionInfoResp.getPermissionInfo().get(IoTDBConstant.COLUMN_PRIVILEGE).get(i));
     }
   }
 
@@ -512,18 +513,18 @@ public class AuthorInfoTest {
     AuthorPlan authorPlan;
 
     Set<Integer> privilegeList = new HashSet<>();
-    privilegeList.add(PrivilegeType.WRITE_DATA.ordinal());
-    privilegeList.add(PrivilegeType.READ_DATA.ordinal());
+    privilegeList.add(PrivilegeType.INSERT_TIMESERIES.ordinal());
+    privilegeList.add(PrivilegeType.READ_TIMESERIES.ordinal());
 
     Map<String, List<String>> permissionInfo;
     List<String> userPrivilege = new ArrayList<>();
-    userPrivilege.add("root.sg.** : READ_DATA WRITE_DATA");
-    userPrivilege.add("root.ln.** : READ_DATA WRITE_DATA");
+    userPrivilege.add("root.sg.** : INSERT_TIMESERIES READ_TIMESERIES");
+    userPrivilege.add("root.ln.** : INSERT_TIMESERIES READ_TIMESERIES");
     Collections.sort(userPrivilege);
 
     List<String> rolePrivilege = new ArrayList<>();
-    rolePrivilege.add("root.abc.** : READ_DATA WRITE_DATA");
-    rolePrivilege.add("root.role_1.** : READ_DATA WRITE_DATA");
+    rolePrivilege.add("root.abc.** : INSERT_TIMESERIES READ_TIMESERIES");
+    rolePrivilege.add("root.role_1.** : INSERT_TIMESERIES READ_TIMESERIES");
     Collections.sort(rolePrivilege);
 
     List<String> allPrivilege = new ArrayList<>();
@@ -578,7 +579,7 @@ public class AuthorInfoTest {
     // check user privileges
     status =
         authorInfo
-            .checkUserPrivileges("user0", userPaths, 
PrivilegeType.WRITE_DATA.ordinal())
+            .checkUserPrivileges("user0", userPaths, 
PrivilegeType.INSERT_TIMESERIES.ordinal())
             .getStatus();
     Assert.assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), 
status.getCode());
 
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 a7feb9966c8..674f09d2bb1 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
@@ -75,7 +75,7 @@ public class AuthorityChecker {
     int permission = translateToPermissionId(type);
     if (permission == -1) {
       return false;
-    } else if (permission == PrivilegeType.ALTER_PASSWORD.ordinal()
+    } else if (permission == PrivilegeType.MODIFY_PASSWORD.ordinal()
         && username.equals(targetUser)) {
       // A user can modify his own password
       return true;
@@ -152,32 +152,43 @@ public class AuthorityChecker {
 
   private static int translateToPermissionId(StatementType type) {
     switch (type) {
-      case SHOW_SCHEMA_TEMPLATE:
-      case SHOW_NODES_IN_SCHEMA_TEMPLATE:
-      case SHOW_PATH_SET_SCHEMA_TEMPLATE:
-      case SHOW_PATH_USING_SCHEMA_TEMPLATE:
-        return PrivilegeType.READ_SCHEMA.ordinal();
+      case CREATE_ROLE:
+        return PrivilegeType.CREATE_ROLE.ordinal();
+      case CREATE_USER:
+        return PrivilegeType.CREATE_USER.ordinal();
+      case DELETE_USER:
+        return PrivilegeType.DELETE_USER.ordinal();
+      case DELETE_ROLE:
+        return PrivilegeType.DELETE_ROLE.ordinal();
+      case MODIFY_PASSWORD:
+        return PrivilegeType.MODIFY_PASSWORD.ordinal();
+      case GRANT_USER_PRIVILEGE:
+        return PrivilegeType.GRANT_USER_PRIVILEGE.ordinal();
+      case GRANT_ROLE_PRIVILEGE:
+        return PrivilegeType.GRANT_ROLE_PRIVILEGE.ordinal();
+      case REVOKE_USER_PRIVILEGE:
+        return PrivilegeType.REVOKE_USER_PRIVILEGE.ordinal();
+      case REVOKE_ROLE_PRIVILEGE:
+        return PrivilegeType.REVOKE_ROLE_PRIVILEGE.ordinal();
+      case GRANT_USER_ROLE:
+        return PrivilegeType.GRANT_USER_ROLE.ordinal();
+      case REVOKE_USER_ROLE:
+        return PrivilegeType.REVOKE_USER_ROLE.ordinal();
       case STORAGE_GROUP_SCHEMA:
-      case DELETE_STORAGE_GROUP:
-        return PrivilegeType.MANAGE_DATABASE.ordinal();
       case TTL:
+        return PrivilegeType.CREATE_DATABASE.ordinal();
+      case DELETE_STORAGE_GROUP:
+        return PrivilegeType.DELETE_DATABASE.ordinal();
       case CREATE_TIMESERIES:
       case CREATE_ALIGNED_TIMESERIES:
       case CREATE_MULTI_TIMESERIES:
+        return PrivilegeType.CREATE_TIMESERIES.ordinal();
       case DELETE_TIMESERIES:
+      case DELETE:
       case DROP_INDEX:
+        return PrivilegeType.DELETE_TIMESERIES.ordinal();
       case ALTER_TIMESERIES:
-      case CREATE_TEMPLATE:
-      case DROP_TEMPLATE:
-      case SET_TEMPLATE:
-      case ACTIVATE_TEMPLATE:
-      case DEACTIVATE_TEMPLATE:
-      case UNSET_TEMPLATE:
-      case CREATE_LOGICAL_VIEW:
-      case ALTER_LOGICAL_VIEW:
-      case RENAME_LOGICAL_VIEW:
-      case DELETE_LOGICAL_VIEW:
-        return PrivilegeType.WRITE_SCHEMA.ordinal();
+        return PrivilegeType.ALTER_TIMESERIES.ordinal();
       case SHOW:
       case QUERY:
       case GROUP_BY_TIME:
@@ -190,55 +201,75 @@ public class AuthorityChecker {
       case GROUP_BY_FILL:
       case SELECT_INTO:
       case COUNT:
-      case CREATE_FUNCTION:
-      case DROP_FUNCTION:
-        return PrivilegeType.READ_DATA.ordinal();
+        return PrivilegeType.READ_TIMESERIES.ordinal();
       case INSERT:
-      case DELETE:
       case LOAD_DATA:
       case CREATE_INDEX:
       case BATCH_INSERT:
       case BATCH_INSERT_ONE_DEVICE:
       case BATCH_INSERT_ROWS:
       case MULTI_BATCH_INSERT:
-        return PrivilegeType.WRITE_DATA.ordinal();
-      case CREATE_USER:
-      case DELETE_USER:
-      case LIST_USER:
-      case LIST_USER_ROLES:
-      case LIST_USER_PRIVILEGE:
-        return PrivilegeType.MANAGE_USER.ordinal();
-      case CREATE_ROLE:
-      case DELETE_ROLE:
+        return PrivilegeType.INSERT_TIMESERIES.ordinal();
       case LIST_ROLE:
       case LIST_ROLE_USERS:
       case LIST_ROLE_PRIVILEGE:
-        return PrivilegeType.MANAGE_ROLE.ordinal();
-      case MODIFY_PASSWORD:
-        return PrivilegeType.ALTER_PASSWORD.ordinal();
-      case GRANT_USER_PRIVILEGE:
-      case REVOKE_USER_PRIVILEGE:
-      case GRANT_ROLE_PRIVILEGE:
-      case REVOKE_ROLE_PRIVILEGE:
-      case GRANT_USER_ROLE:
-      case REVOKE_USER_ROLE:
-        return PrivilegeType.GRANT_PRIVILEGE.ordinal();
+        return PrivilegeType.LIST_ROLE.ordinal();
+      case LIST_USER:
+      case LIST_USER_ROLES:
+      case LIST_USER_PRIVILEGE:
+        return PrivilegeType.LIST_USER.ordinal();
+      case CREATE_FUNCTION:
+        return PrivilegeType.CREATE_FUNCTION.ordinal();
+      case DROP_FUNCTION:
+        return PrivilegeType.DROP_FUNCTION.ordinal();
       case CREATE_TRIGGER:
+        return PrivilegeType.CREATE_TRIGGER.ordinal();
       case DROP_TRIGGER:
-        return PrivilegeType.USE_TRIGGER.ordinal();
+        return PrivilegeType.DROP_TRIGGER.ordinal();
       case CREATE_CONTINUOUS_QUERY:
+        return PrivilegeType.CREATE_CONTINUOUS_QUERY.ordinal();
       case DROP_CONTINUOUS_QUERY:
+        return PrivilegeType.DROP_CONTINUOUS_QUERY.ordinal();
+      case CREATE_TEMPLATE:
+      case DROP_TEMPLATE:
+        return PrivilegeType.UPDATE_TEMPLATE.ordinal();
+      case SET_TEMPLATE:
+      case ACTIVATE_TEMPLATE:
+      case DEACTIVATE_TEMPLATE:
+      case UNSET_TEMPLATE:
+        return PrivilegeType.APPLY_TEMPLATE.ordinal();
+      case SHOW_SCHEMA_TEMPLATE:
+      case SHOW_NODES_IN_SCHEMA_TEMPLATE:
+        return PrivilegeType.READ_TEMPLATE.ordinal();
+      case SHOW_PATH_SET_SCHEMA_TEMPLATE:
+      case SHOW_PATH_USING_SCHEMA_TEMPLATE:
+        return PrivilegeType.READ_TEMPLATE_APPLICATION.ordinal();
       case SHOW_CONTINUOUS_QUERIES:
-        return PrivilegeType.USE_CQ.ordinal();
+        return PrivilegeType.SHOW_CONTINUOUS_QUERIES.ordinal();
       case CREATE_PIPEPLUGIN:
+        return PrivilegeType.CREATE_PIPEPLUGIN.ordinal();
       case DROP_PIPEPLUGIN:
+        return PrivilegeType.DROP_PIPEPLUGIN.ordinal();
       case SHOW_PIPEPLUGINS:
+        return PrivilegeType.SHOW_PIPEPLUGINS.ordinal();
       case CREATE_PIPE:
+        return PrivilegeType.CREATE_PIPE.ordinal();
       case START_PIPE:
+        return PrivilegeType.START_PIPE.ordinal();
       case STOP_PIPE:
+        return PrivilegeType.STOP_PIPE.ordinal();
       case DROP_PIPE:
+        return PrivilegeType.DROP_PIPE.ordinal();
       case SHOW_PIPES:
-        return PrivilegeType.USE_PIPE.ordinal();
+        return PrivilegeType.SHOW_PIPES.ordinal();
+      case CREATE_LOGICAL_VIEW:
+        return PrivilegeType.CREATE_VIEW.ordinal();
+      case ALTER_LOGICAL_VIEW:
+        return PrivilegeType.ALTER_VIEW.ordinal();
+      case RENAME_LOGICAL_VIEW:
+        return PrivilegeType.RENAME_VIEW.ordinal();
+      case DELETE_LOGICAL_VIEW:
+        return PrivilegeType.DELETE_VIEW.ordinal();
       default:
         logger.error("Unrecognizable operator type ({}) for 
AuthorityChecker.", type);
         return -1;
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 255d26f8252..68056580beb 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
@@ -303,15 +303,13 @@ public class ClusterAuthorityFetcher implements 
IAuthorityFetcher {
    */
   private PathPrivilege toPathPrivilege(PartialPath path, String privilege) {
     PathPrivilege pathPrivilege = new PathPrivilege();
-    pathPrivilege.setPath(path);
+    String[] privileges = privilege.replace(" ", "").split(",");
     Set<Integer> privilegeIds = new HashSet<>();
-    pathPrivilege.setPrivileges(privilegeIds);
-    if (privilege.trim().length() != 0) {
-      String[] privileges = privilege.replace(" ", "").split(",");
-      for (String p : privileges) {
-        privilegeIds.add(Integer.parseInt(p));
-      }
+    for (String p : privileges) {
+      privilegeIds.add(Integer.parseInt(p));
     }
+    pathPrivilege.setPrivileges(privilegeIds);
+    pathPrivilege.setPath(path);
     return pathPrivilege;
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
index e3b27b0402e..1f49e916428 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
@@ -2267,6 +2267,12 @@ public class ASTVisitor extends 
IoTDBSqlParserBaseVisitor<Statement> {
     boolean pathRelevant = true;
     String errorPrivilegeName = "";
     for (String privilege : privileges) {
+      if ("SET_STORAGE_GROUP".equalsIgnoreCase(privilege)) {
+        privilege = PrivilegeType.CREATE_DATABASE.name();
+      }
+      if ("DELETE_STORAGE_GROUP".equalsIgnoreCase(privilege)) {
+        privilege = PrivilegeType.DELETE_DATABASE.name();
+      }
       if (!PrivilegeType.valueOf(privilege.toUpperCase()).isPathRelevant()) {
         pathRelevant = false;
         errorPrivilegeName = privilege.toUpperCase();
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/AuthorizerManagerTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/AuthorizerManagerTest.java
index 37f71925dbc..2fac0adae4d 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/AuthorizerManagerTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/AuthorizerManagerTest.java
@@ -54,8 +54,8 @@ public class AuthorizerManagerTest {
     Set<Integer> privilegesIds = new HashSet<>();
     PathPrivilege privilege = new PathPrivilege();
     List<PathPrivilege> privilegeList = new ArrayList<>();
-    privilegesIds.add(PrivilegeType.MANAGE_ROLE.ordinal());
-    privilegesIds.add(PrivilegeType.GRANT_PRIVILEGE.ordinal());
+    privilegesIds.add(PrivilegeType.CREATE_ROLE.ordinal());
+    privilegesIds.add(PrivilegeType.REVOKE_USER_ROLE.ordinal());
     privilege.setPath(new PartialPath("root.ln"));
     privilege.setPrivileges(privilegesIds);
     privilegeList.add(privilege);
@@ -108,7 +108,7 @@ public class AuthorizerManagerTest {
             .checkUserPrivileges(
                 "user",
                 Collections.singletonList(new PartialPath("root.ln")),
-                PrivilegeType.MANAGE_ROLE.ordinal())
+                PrivilegeType.CREATE_ROLE.ordinal())
             .getCode());
     // User does not have permission
     Assert.assertEquals(
@@ -117,7 +117,7 @@ public class AuthorizerManagerTest {
             .checkUserPrivileges(
                 "user",
                 Collections.singletonList(new PartialPath("root.ln")),
-                PrivilegeType.MANAGE_USER.ordinal())
+                PrivilegeType.CREATE_USER.ordinal())
             .getCode());
 
     // Authenticate users with roles
@@ -153,7 +153,7 @@ public class AuthorizerManagerTest {
             .checkUserPrivileges(
                 "user",
                 Collections.singletonList(new PartialPath("root.ln")),
-                PrivilegeType.MANAGE_ROLE.ordinal())
+                PrivilegeType.CREATE_ROLE.ordinal())
             .getCode());
     // role does not have permission
     Assert.assertEquals(
@@ -162,7 +162,7 @@ public class AuthorizerManagerTest {
             .checkUserPrivileges(
                 "user",
                 Collections.singletonList(new PartialPath("root.ln")),
-                PrivilegeType.MANAGE_USER.ordinal())
+                PrivilegeType.CREATE_USER.ordinal())
             .getCode());
 
     authorityFetcher.getAuthorCache().invalidateCache(user.getName(), "");
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/authorizer/LocalFileAuthorizerTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/authorizer/LocalFileAuthorizerTest.java
index 8b532268ca5..fc659a02db0 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/authorizer/LocalFileAuthorizerTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/authorizer/LocalFileAuthorizerTest.java
@@ -97,7 +97,7 @@ public class LocalFileAuthorizerTest {
     try {
       authorizer.grantPrivilegeToUser(user.getName(), nodeName, 1);
     } catch (AuthException e) {
-      assertEquals("User user already has WRITE_DATA on root.laptop.d1", 
e.getMessage());
+      assertEquals("User user already has INSERT_TIMESERIES on 
root.laptop.d1", e.getMessage());
     }
     try {
       authorizer.grantPrivilegeToUser("error", nodeName, 1);
@@ -122,7 +122,7 @@ public class LocalFileAuthorizerTest {
     try {
       authorizer.revokePrivilegeFromUser(user.getName(), nodeName, 1);
     } catch (AuthException e) {
-      assertEquals("User user does not have WRITE_DATA on root.laptop.d1", 
e.getMessage());
+      assertEquals("User user does not have INSERT_TIMESERIES on 
root.laptop.d1", e.getMessage());
     }
 
     try {
@@ -169,13 +169,13 @@ public class LocalFileAuthorizerTest {
     try {
       authorizer.grantPrivilegeToRole(roleName, nodeName, 1);
     } catch (AuthException e) {
-      assertEquals("Role role already has WRITE_DATA on root.laptop.d1", 
e.getMessage());
+      assertEquals("Role role already has INSERT_TIMESERIES on 
root.laptop.d1", e.getMessage());
     }
     authorizer.revokePrivilegeFromRole(roleName, nodeName, 1);
     try {
       authorizer.revokePrivilegeFromRole(roleName, nodeName, 1);
     } catch (AuthException e) {
-      assertEquals("Role role does not have WRITE_DATA on root.laptop.d1", 
e.getMessage());
+      assertEquals("Role role does not have INSERT_TIMESERIES on 
root.laptop.d1", e.getMessage());
     }
     authorizer.deleteRole(roleName);
     try {
@@ -200,12 +200,10 @@ public class LocalFileAuthorizerTest {
 
     // a user can get all role permissions.
     Set<Integer> permissions = authorizer.getPrivileges(user.getName(), 
nodeName);
-    assertEquals(4, permissions.size());
-    assertTrue(permissions.contains(0));
+    assertEquals(2, permissions.size());
     assertTrue(permissions.contains(1));
-    assertTrue(permissions.contains(2));
     assertTrue(permissions.contains(3));
-    assertFalse(permissions.contains(4));
+    assertFalse(permissions.contains(2));
 
     try {
       authorizer.grantRoleToUser(roleName, user.getName());
@@ -215,7 +213,7 @@ public class LocalFileAuthorizerTest {
     // revoke a role from a user, the user will lose all role's permission
     authorizer.revokeRoleFromUser(roleName, user.getName());
     Set<Integer> revokeRolePermissions = 
authorizer.getPrivileges(user.getName(), nodeName);
-    assertEquals(2, revokeRolePermissions.size());
+    assertEquals(1, revokeRolePermissions.size());
     assertTrue(revokeRolePermissions.contains(1));
     assertFalse(revokeRolePermissions.contains(2));
 
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/entity/PathPrivilegeTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/entity/PathPrivilegeTest.java
index 3a8e6ea4b9f..757f88da183 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/entity/PathPrivilegeTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/entity/PathPrivilegeTest.java
@@ -34,12 +34,12 @@ public class PathPrivilegeTest {
     PathPrivilege pathPrivilege = new PathPrivilege();
     pathPrivilege.setPath(new PartialPath("root.ln"));
     pathPrivilege.setPrivileges(Collections.singleton(1));
-    Assert.assertEquals("root.ln : WRITE_DATA", pathPrivilege.toString());
+    Assert.assertEquals("root.ln : INSERT_TIMESERIES", 
pathPrivilege.toString());
     PathPrivilege pathPrivilege1 = new PathPrivilege();
     pathPrivilege1.setPath(new PartialPath("root.sg"));
     pathPrivilege1.setPrivileges(Collections.singleton(1));
     Assert.assertNotEquals(pathPrivilege, pathPrivilege1);
     pathPrivilege.deserialize(pathPrivilege1.serialize());
-    Assert.assertEquals("root.sg : WRITE_DATA", pathPrivilege.toString());
+    Assert.assertEquals("root.sg : INSERT_TIMESERIES", 
pathPrivilege.toString());
   }
 }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/entity/RoleTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/entity/RoleTest.java
index e32d119df68..724b6097dee 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/entity/RoleTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/entity/RoleTest.java
@@ -36,10 +36,11 @@ public class RoleTest {
     PathPrivilege pathPrivilege = new PathPrivilege(new 
PartialPath("root.ln"));
     role.setPrivilegeList(Collections.singletonList(pathPrivilege));
     role.setPrivileges(new PartialPath("root.ln"), Collections.singleton(1));
-    Assert.assertEquals("Role{name='role', privilegeList=[root.ln : 
WRITE_DATA]}", role.toString());
+    Assert.assertEquals(
+        "Role{name='role', privilegeList=[root.ln : INSERT_TIMESERIES]}", 
role.toString());
     Role role1 = new Role("role1");
     role1.deserialize(role.serialize());
     Assert.assertEquals(
-        "Role{name='role', privilegeList=[root.ln : WRITE_DATA]}", 
role1.toString());
+        "Role{name='role', privilegeList=[root.ln : INSERT_TIMESERIES]}", 
role1.toString());
   }
 }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/entity/UserTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/entity/UserTest.java
index c14ce60174a..467e1777e1c 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/entity/UserTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/entity/UserTest.java
@@ -37,14 +37,12 @@ public class UserTest {
     user.setPrivilegeList(Collections.singletonList(pathPrivilege));
     user.setPrivileges(new PartialPath("root.ln"), Collections.singleton(1));
     Assert.assertEquals(
-        "User{name='user', password='password', privilegeList=[root.ln : 
WRITE_DATA], roleList=[], "
-            + "isOpenIdUser=false, useWaterMark=false, lastActiveTime=0}",
+        "User{name='user', password='password', privilegeList=[root.ln : 
INSERT_TIMESERIES], roleList=[], isOpenIdUser=false, useWaterMark=false, 
lastActiveTime=0}",
         user.toString());
     User user1 = new User("user1", "password1");
     user1.deserialize(user.serialize());
     Assert.assertEquals(
-        "User{name='user', password='password', privilegeList=[root.ln : 
WRITE_DATA], roleList=[], "
-            + "isOpenIdUser=false, useWaterMark=false, lastActiveTime=0}",
+        "User{name='user', password='password', privilegeList=[root.ln : 
INSERT_TIMESERIES], roleList=[], isOpenIdUser=false, useWaterMark=false, 
lastActiveTime=0}",
         user1.toString());
   }
 }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/user/LocalFileUserManagerTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/user/LocalFileUserManagerTest.java
index a1ce4909901..a4ebb201539 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/user/LocalFileUserManagerTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/user/LocalFileUserManagerTest.java
@@ -65,13 +65,13 @@ public class LocalFileUserManagerTest {
   public void testIllegalInput() throws AuthException {
     // Password contains space
     try {
-      manager.createUser("username1", "password_ ", false);
+      manager.createUser("username1", "password_ ");
     } catch (AuthException e) {
       assertTrue(e.getMessage().contains("cannot contain spaces"));
     }
     // Username contains space
     try {
-      assertFalse(manager.createUser("username 2", "password_", false));
+      assertFalse(manager.createUser("username 2", "password_"));
     } catch (AuthException e) {
       assertTrue(e.getMessage().contains("cannot contain spaces"));
     }
@@ -94,7 +94,7 @@ public class LocalFileUserManagerTest {
     User user = manager.getUser(users[0].getName());
     assertNull(user);
     for (User user1 : users) {
-      assertTrue(manager.createUser(user1.getName(), user1.getPassword(), 
false));
+      assertTrue(manager.createUser(user1.getName(), user1.getPassword()));
     }
     for (User user1 : users) {
       user = manager.getUser(user1.getName());
@@ -102,17 +102,17 @@ public class LocalFileUserManagerTest {
       assertTrue(AuthUtils.validatePassword(user1.getPassword(), 
user.getPassword()));
     }
 
-    assertFalse(manager.createUser(users[0].getName(), users[0].getPassword(), 
false));
+    assertFalse(manager.createUser(users[0].getName(), 
users[0].getPassword()));
     boolean caught = false;
     try {
-      manager.createUser("too", "short", false);
+      manager.createUser("too", "short");
     } catch (AuthException e) {
       caught = true;
     }
     assertTrue(caught);
     caught = false;
     try {
-      manager.createUser("short", "too", false);
+      manager.createUser("short", "too");
     } catch (AuthException e) {
       caught = true;
     }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/security/encrypt/MessageDigestEncryptTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/security/encrypt/MessageDigestEncryptTest.java
index 9ad6d671204..146947c0948 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/security/encrypt/MessageDigestEncryptTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/security/encrypt/MessageDigestEncryptTest.java
@@ -80,7 +80,7 @@ public class MessageDigestEncryptTest {
     User user = manager.getUser(users[0].getName());
     assertNull(user);
     for (User user1 : users) {
-      assertTrue(manager.createUser(user1.getName(), user1.getPassword(), 
false));
+      assertTrue(manager.createUser(user1.getName(), user1.getPassword()));
     }
     for (User user1 : users) {
       user = manager.getUser(user1.getName());
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/authorizer/BasicAuthorizer.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/authorizer/BasicAuthorizer.java
index 93c0237e49b..7c1c891bb92 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/authorizer/BasicAuthorizer.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/authorizer/BasicAuthorizer.java
@@ -119,7 +119,7 @@ public abstract class BasicAuthorizer implements 
IAuthorizer, IService {
 
   @Override
   public void createUser(String username, String password) throws 
AuthException {
-    if (!userManager.createUser(username, password, false)) {
+    if (!userManager.createUser(username, password)) {
       throw new AuthException(
           TSStatusCode.USER_ALREADY_EXIST, String.format("User %s already 
exists", username));
     }
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/entity/PrivilegeType.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/entity/PrivilegeType.java
index c3ef891ea7e..41b7252f510 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/entity/PrivilegeType.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/entity/PrivilegeType.java
@@ -19,63 +19,68 @@
 
 package org.apache.iotdb.commons.auth.entity;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
 /** This enum class contains all available privileges in IoTDB. */
 public enum PrivilegeType {
-  READ_DATA(true),
-  WRITE_DATA(true, true, READ_DATA),
-  READ_SCHEMA(true),
-  WRITE_SCHEMA(true, true, READ_SCHEMA),
-  MANAGE_USER,
-  MANAGE_ROLE,
-  GRANT_PRIVILEGE,
-  ALTER_PASSWORD,
-  USE_TRIGGER(true),
-  USE_CQ,
-  USE_PIPE,
-  MANAGE_DATABASE(true),
-  READ(true, false, READ_DATA, READ_SCHEMA),
-  WRITE(true, false, WRITE_DATA, WRITE_SCHEMA),
-  ALL(
-      true,
-      false,
-      READ,
-      WRITE,
-      MANAGE_USER,
-      MANAGE_ROLE,
-      GRANT_PRIVILEGE,
-      ALTER_PASSWORD,
-      USE_TRIGGER,
-      USE_CQ,
-      USE_PIPE,
-      MANAGE_DATABASE);
+  CREATE_DATABASE(true),
+  INSERT_TIMESERIES(true),
+  @Deprecated
+  UPDATE_TIMESERIES(true),
+  READ_TIMESERIES(true),
+  CREATE_TIMESERIES(true),
+  DELETE_TIMESERIES(true),
+  CREATE_USER,
+  DELETE_USER,
+  MODIFY_PASSWORD,
+  LIST_USER,
+  GRANT_USER_PRIVILEGE,
+  REVOKE_USER_PRIVILEGE,
+  GRANT_USER_ROLE,
+  REVOKE_USER_ROLE,
+  CREATE_ROLE,
+  DELETE_ROLE,
+  LIST_ROLE,
+  GRANT_ROLE_PRIVILEGE,
+  REVOKE_ROLE_PRIVILEGE,
+  CREATE_FUNCTION,
+  DROP_FUNCTION,
+  CREATE_TRIGGER(true),
+  DROP_TRIGGER(true),
+  START_TRIGGER(true),
+  STOP_TRIGGER(true),
+  CREATE_CONTINUOUS_QUERY,
+  DROP_CONTINUOUS_QUERY,
+  ALL,
+  DELETE_DATABASE(true),
+  ALTER_TIMESERIES(true),
+  UPDATE_TEMPLATE,
+  READ_TEMPLATE,
+  APPLY_TEMPLATE(true),
+  READ_TEMPLATE_APPLICATION,
+  SHOW_CONTINUOUS_QUERIES,
+  CREATE_PIPEPLUGIN,
+  DROP_PIPEPLUGIN,
+  SHOW_PIPEPLUGINS,
+  CREATE_PIPE,
+  START_PIPE,
+  STOP_PIPE,
+  DROP_PIPE,
+  SHOW_PIPES,
+  CREATE_VIEW(true),
+  ALTER_VIEW(true),
+  RENAME_VIEW(true),
+  DELETE_VIEW(true),
+  ;
 
   private static final int PRIVILEGE_COUNT = values().length;
 
   private final boolean isPathRelevant;
-  private final boolean isStorable;
-  private final List<PrivilegeType> subPrivileges = new ArrayList<>();
 
   PrivilegeType() {
     this.isPathRelevant = false;
-    this.isStorable = true;
   }
 
   PrivilegeType(boolean isPathRelevant) {
     this.isPathRelevant = isPathRelevant;
-    this.isStorable = true;
-  }
-
-  PrivilegeType(boolean isPathRelevant, boolean isStorable, PrivilegeType... 
privilegeTypes) {
-    this.isPathRelevant = isPathRelevant;
-    this.isStorable = isStorable;
-    this.subPrivileges.addAll(Arrays.asList(privilegeTypes));
   }
 
   /**
@@ -89,32 +94,7 @@ public enum PrivilegeType {
     return 0 <= type && type < PRIVILEGE_COUNT && 
values()[type].isPathRelevant;
   }
 
-  public static boolean isStorable(int type) {
-    return 0 <= type && type < PRIVILEGE_COUNT && values()[type].isStorable;
-  }
-
   public boolean isPathRelevant() {
     return isPathRelevant;
   }
-
-  public static Set<PrivilegeType> getStorablePrivilege(Integer ordinal) {
-    if (ordinal < 0 || ordinal >= PRIVILEGE_COUNT) {
-      return Collections.emptySet();
-    }
-    PrivilegeType privilegeType = PrivilegeType.values()[ordinal];
-    return privilegeType.getStorablePrivilege();
-  }
-
-  public Set<PrivilegeType> getStorablePrivilege() {
-    Set<PrivilegeType> result = new HashSet<>();
-    if (isStorable) {
-      // if this privilege is storable, add it to the result set
-      result.add(this);
-    }
-    for (PrivilegeType privilegeType : subPrivileges) {
-      // add all storable privileges of sub privileges to the result set
-      result.addAll(privilegeType.getStorablePrivilege());
-    }
-    return result;
-  }
 }
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/role/BasicRoleManager.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/role/BasicRoleManager.java
index bcdd1bc1a7c..142532434b0 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/role/BasicRoleManager.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/role/BasicRoleManager.java
@@ -19,7 +19,6 @@
 package org.apache.iotdb.commons.auth.role;
 
 import org.apache.iotdb.commons.auth.AuthException;
-import org.apache.iotdb.commons.auth.entity.PrivilegeType;
 import org.apache.iotdb.commons.auth.entity.Role;
 import org.apache.iotdb.commons.concurrent.HashLock;
 import org.apache.iotdb.commons.path.PartialPath;
@@ -146,7 +145,7 @@ public abstract class BasicRoleManager implements 
IRoleManager {
         throw new AuthException(
             TSStatusCode.ROLE_NOT_EXIST, String.format("No such role %s", 
rolename));
       }
-      if (PrivilegeType.isStorable(privilegeId) && !role.hasPrivilege(path, 
privilegeId)) {
+      if (!role.hasPrivilege(path, privilegeId)) {
         return false;
       }
       role.removePrivilege(path, privilegeId);
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/user/BasicUserManager.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/user/BasicUserManager.java
index 042d671497c..4b872db74ed 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/user/BasicUserManager.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/user/BasicUserManager.java
@@ -19,7 +19,6 @@
 package org.apache.iotdb.commons.auth.user;
 
 import org.apache.iotdb.commons.auth.AuthException;
-import org.apache.iotdb.commons.auth.entity.PrivilegeType;
 import org.apache.iotdb.commons.auth.entity.User;
 import org.apache.iotdb.commons.concurrent.HashLock;
 import org.apache.iotdb.commons.conf.CommonDescriptor;
@@ -83,8 +82,7 @@ public abstract class BasicUserManager implements 
IUserManager {
     if (admin == null) {
       createUser(
           CommonDescriptor.getInstance().getConfig().getAdminName(),
-          CommonDescriptor.getInstance().getConfig().getAdminPassword(),
-          true);
+          CommonDescriptor.getInstance().getConfig().getAdminPassword());
       
setUserUseWaterMark(CommonDescriptor.getInstance().getConfig().getAdminName(), 
false);
     }
     logger.info("Admin initialized");
@@ -113,12 +111,9 @@ public abstract class BasicUserManager implements 
IUserManager {
   }
 
   @Override
-  public boolean createUser(String username, String password, boolean 
firstInit)
-      throws AuthException {
-    if (!firstInit) {
-      AuthUtils.validateUsername(username);
-      AuthUtils.validatePassword(password);
-    }
+  public boolean createUser(String username, String password) throws 
AuthException {
+    AuthUtils.validateUsername(username);
+    AuthUtils.validatePassword(password);
 
     User user = getUser(username);
     if (user != null) {
@@ -197,7 +192,7 @@ public abstract class BasicUserManager implements 
IUserManager {
         throw new AuthException(
             TSStatusCode.USER_NOT_EXIST, String.format(NO_SUCH_USER_ERROR, 
username));
       }
-      if (PrivilegeType.isStorable(privilegeId) && !user.hasPrivilege(path, 
privilegeId)) {
+      if (!user.hasPrivilege(path, privilegeId)) {
         return false;
       }
       user.removePrivilege(path, privilegeId);
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/user/IUserManager.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/user/IUserManager.java
index 501ec2be4a7..f403db6195e 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/user/IUserManager.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/user/IUserManager.java
@@ -43,11 +43,10 @@ public interface IUserManager extends SnapshotProcessor {
    *
    * @param username is not null or empty
    * @param password is not null or empty
-   * @param firstInit is first init admin
    * @return True if the user is successfully created, false when the user 
already exists.
    * @throws AuthException if the given username or password is illegal.
    */
-  boolean createUser(String username, String password, boolean firstInit) 
throws AuthException;
+  boolean createUser(String username, String password) throws AuthException;
 
   /**
    * Delete a user.
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/AuthUtils.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/AuthUtils.java
index ad49ad5288d..a1a3507e38e 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/AuthUtils.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/AuthUtils.java
@@ -50,9 +50,9 @@ public class AuthUtils {
   private static final Logger logger = 
LoggerFactory.getLogger(AuthUtils.class);
   private static final String ROOT_PREFIX = IoTDBConstant.PATH_ROOT;
   public static PartialPath ROOT_PATH_PRIVILEGE_PATH;
-  private static final int MIN_LENGTH = 4;
-  private static final int MAX_LENGTH = 64;
-  private static final String REX_PATTERN = "^[-\\w]*$";
+  private static final int MIN_PASSWORD_LENGTH = 4;
+  private static final int MIN_USERNAME_LENGTH = 4;
+  private static final int MIN_ROLENAME_LENGTH = 4;
 
   static {
     try {
@@ -77,7 +77,14 @@ public class AuthUtils {
    * @throws AuthException contains message why password is invalid
    */
   public static void validatePassword(String password) throws AuthException {
-    validateNameOrPassword(password);
+    if (password.length() < MIN_PASSWORD_LENGTH) {
+      throw new AuthException(
+          TSStatusCode.ILLEGAL_PARAMETER,
+          "Password's size must be greater than or equal to " + 
MIN_PASSWORD_LENGTH);
+    }
+    if (password.contains(" ")) {
+      throw new AuthException(TSStatusCode.ILLEGAL_PARAMETER, "Password cannot 
contain spaces");
+    }
   }
 
   /**
@@ -100,7 +107,14 @@ public class AuthUtils {
    * @throws AuthException contains message why username is invalid
    */
   public static void validateUsername(String username) throws AuthException {
-    validateNameOrPassword(username);
+    if (username.length() < MIN_USERNAME_LENGTH) {
+      throw new AuthException(
+          TSStatusCode.ILLEGAL_PARAMETER,
+          "Username's size must be greater than or equal to " + 
MIN_USERNAME_LENGTH);
+    }
+    if (username.contains(" ")) {
+      throw new AuthException(TSStatusCode.ILLEGAL_PARAMETER, "Username cannot 
contain spaces");
+    }
   }
 
   /**
@@ -110,26 +124,13 @@ public class AuthUtils {
    * @throws AuthException contains message why rolename is invalid
    */
   public static void validateRolename(String rolename) throws AuthException {
-    validateNameOrPassword(rolename);
-  }
-
-  public static void validateNameOrPassword(String str) throws AuthException {
-    int length = str.length();
-    if (length < MIN_LENGTH) {
-      throw new AuthException(
-          TSStatusCode.ILLEGAL_PARAMETER,
-          "The length of name or password must be greater than or equal to " + 
MIN_LENGTH);
-    } else if (length > MAX_LENGTH) {
+    if (rolename.length() < MIN_ROLENAME_LENGTH) {
       throw new AuthException(
           TSStatusCode.ILLEGAL_PARAMETER,
-          "The length of name or password must be less than or equal to " + 
MAX_LENGTH);
-    } else if (str.contains(" ")) {
-      throw new AuthException(
-          TSStatusCode.ILLEGAL_PARAMETER, "The name or password cannot contain 
spaces");
-    } else if (!str.matches(REX_PATTERN)) {
-      throw new AuthException(
-          TSStatusCode.ILLEGAL_PARAMETER,
-          "The name or password can only contain letters, numbers, and 
underscores");
+          "Role name's size must be greater than or equal to " + 
MIN_ROLENAME_LENGTH);
+    }
+    if (rolename.contains(" ")) {
+      throw new AuthException(TSStatusCode.ILLEGAL_PARAMETER, "Role name 
cannot contain spaces");
     }
   }
 
@@ -175,12 +176,22 @@ public class AuthUtils {
     if (!path.equals(ROOT_PATH_PRIVILEGE_PATH)) {
       validatePath(path);
       switch (type) {
-        case READ_SCHEMA:
-        case WRITE_SCHEMA:
-        case READ_DATA:
-        case WRITE_DATA:
-        case USE_TRIGGER:
-        case MANAGE_DATABASE:
+        case READ_TIMESERIES:
+        case CREATE_DATABASE:
+        case DELETE_DATABASE:
+        case CREATE_TIMESERIES:
+        case DELETE_TIMESERIES:
+        case INSERT_TIMESERIES:
+        case ALTER_TIMESERIES:
+        case CREATE_TRIGGER:
+        case DROP_TRIGGER:
+        case START_TRIGGER:
+        case STOP_TRIGGER:
+        case APPLY_TEMPLATE:
+        case CREATE_VIEW:
+        case ALTER_VIEW:
+        case RENAME_VIEW:
+        case DELETE_VIEW:
           return;
         default:
           throw new AuthException(
@@ -189,11 +200,17 @@ public class AuthUtils {
       }
     } else {
       switch (type) {
-        case READ_SCHEMA:
-        case WRITE_SCHEMA:
-        case MANAGE_DATABASE:
-        case READ_DATA:
-        case WRITE_DATA:
+        case READ_TIMESERIES:
+        case CREATE_DATABASE:
+        case DELETE_DATABASE:
+        case CREATE_TIMESERIES:
+        case DELETE_TIMESERIES:
+        case INSERT_TIMESERIES:
+        case ALTER_TIMESERIES:
+        case CREATE_VIEW:
+        case ALTER_VIEW:
+        case RENAME_VIEW:
+        case DELETE_VIEW:
           validatePath(path);
           return;
         default:
@@ -317,8 +334,12 @@ public class AuthUtils {
       privilegeList.add(targetPathPrivilege);
     }
     // add privilegeId into targetPathPrivilege
-    for (PrivilegeType privilegeType : 
PrivilegeType.getStorablePrivilege(privilegeId)) {
-      targetPathPrivilege.getPrivileges().add(privilegeType.ordinal());
+    if (privilegeId != PrivilegeType.ALL.ordinal()) {
+      targetPathPrivilege.getPrivileges().add(privilegeId);
+    } else {
+      for (PrivilegeType privilegeType : PrivilegeType.values()) {
+        targetPathPrivilege.getPrivileges().add(privilegeType.ordinal());
+      }
     }
   }
 
@@ -339,11 +360,15 @@ public class AuthUtils {
       }
     }
     if (targetPathPrivilege != null) {
-      for (PrivilegeType privilegeType : 
PrivilegeType.getStorablePrivilege(privilegeId)) {
-        targetPathPrivilege.getPrivileges().remove(privilegeType.ordinal());
-      }
-      if (targetPathPrivilege.getPrivileges().isEmpty()) {
+      if (privilegeId == PrivilegeType.ALL.ordinal()) {
+        // remove all privileges on target path
         privilegeList.remove(targetPathPrivilege);
+      } else {
+        // remove privilege on target path
+        targetPathPrivilege.getPrivileges().remove(privilegeId);
+        if (targetPathPrivilege.getPrivileges().isEmpty()) {
+          privilegeList.remove(targetPathPrivilege);
+        }
       }
     }
   }
@@ -374,6 +399,12 @@ public class AuthUtils {
     PrivilegeType[] types = PrivilegeType.values();
     for (String authorization : authorizationList) {
       boolean legal = false;
+      if ("SET_STORAGE_GROUP".equalsIgnoreCase(authorization)) {
+        authorization = PrivilegeType.CREATE_DATABASE.name();
+      }
+      if ("DELETE_STORAGE_GROUP".equalsIgnoreCase(authorization)) {
+        authorization = PrivilegeType.DELETE_DATABASE.name();
+      }
       for (PrivilegeType privilegeType : types) {
         if (authorization.equalsIgnoreCase(privilegeType.name())) {
           result.add(privilegeType.ordinal());


Reply via email to