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

healchow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/inlong.git


The following commit(s) were added to refs/heads/master by this push:
     new 941e35dae [INLONG-8098][Manager] Support user permission control 
(#8100)
941e35dae is described below

commit 941e35daec49172c74fe1e448b52659997964f7c
Author: vernedeng <[email protected]>
AuthorDate: Thu Jun 1 17:52:50 2023 +0800

    [INLONG-8098][Manager] Support user permission control (#8100)
---
 .../inlong/manager/client/cli/CreateCommand.java   |  4 +-
 .../inlong/manager/client/cli/ListCommand.java     |  4 +-
 .../client/cli/validator/UserTypeValidator.java    |  4 +-
 .../client/api/inner/ClientFactoryTest.java        |  4 +-
 .../manager/client/api/inner/NoAuthClientTest.java |  4 +-
 .../{UserTypeEnum.java => TenantUserTypeEnum.java} | 20 ++---
 .../{RoleEntity.java => InlongUserRoleEntity.java} |  9 +--
 ...Mapper.java => InlongUserRoleEntityMapper.java} | 15 ++--
 .../mappers/InlongUserRoleEntityMapper.xml         | 87 +++++++++++++++++++++
 .../main/resources/mappers/RoleEntityMapper.xml    | 71 -----------------
 .../inlong/manager/pojo/user/InlongRoleInfo.java}  | 43 +++++++---
 .../manager/pojo/user/InlongRolePageRequest.java}  | 33 ++++----
 .../manager/pojo/user/InlongRoleRequest.java}      | 44 +++++++----
 .../inlong/manager/pojo/user/UserRequest.java      |  4 +-
 .../inlong/manager/pojo/user/UserRoleCode.java     | 49 +++++++++++-
 .../service/cluster/InlongClusterServiceImpl.java  |  8 +-
 .../service/core/impl/AuditServiceImpl.java        |  2 +-
 .../manager/service/group/GroupCheckService.java   |  5 +-
 .../service/group/InlongGroupProcessService.java   |  4 +-
 .../service/group/InlongGroupServiceImpl.java      |  4 +-
 .../manager/service/node/DataNodeServiceImpl.java  | 10 +--
 .../service/sink/StreamSinkServiceImpl.java        |  6 +-
 .../service/source/StreamSourceServiceImpl.java    |  4 +-
 .../service/stream/InlongStreamServiceImpl.java    |  2 +-
 .../manager/service/user/InlongRoleService.java}   | 20 ++---
 .../service/user/InlongRoleServiceImpl.java        | 87 +++++++++++++++++++++
 .../manager/service/user/UserServiceImpl.java      | 13 ++--
 .../service/user/InlongRoleServiceTest.java        | 91 ++++++++++++++++++++++
 .../service/user/TenantRoleServiceTest.java        | 12 +--
 .../main/resources/h2/apache_inlong_manager.sql    | 24 +++++-
 .../manager-web/sql/apache_inlong_manager.sql      | 23 ++++++
 inlong-manager/manager-web/sql/changes-1.8.0.sql   | 26 ++++++-
 .../auth/openapi/OpenAPIAuthenticatingRealm.java   |  6 +-
 .../manager/web/auth/web/WebAuthorizingRealm.java  |  6 +-
 .../manager/web/controller/AnnoController.java     |  2 +-
 .../manager/web/controller/DataNodeController.java | 11 +--
 .../web/controller/InlongClusterController.java    | 18 +++--
 .../web/controller/InlongConsumeController.java    |  5 +-
 .../web/controller/InlongGroupController.java      |  5 +-
 ...leController.java => InlongRoleController.java} | 55 +++++++------
 .../web/controller/InlongStreamController.java     |  4 +-
 .../web/controller/InlongTenantRoleController.java |  6 +-
 .../manager/web/controller/UserController.java     |  4 +-
 .../web/controller/WorkflowApproverController.java | 11 +--
 .../manager/web/controller/AnnoControllerTest.java |  6 +-
 .../workflow/core/impl/ProcessServiceImpl.java     |  5 +-
 46 files changed, 612 insertions(+), 268 deletions(-)

diff --git 
a/inlong-manager/manager-client-tools/src/main/java/org/apache/inlong/manager/client/cli/CreateCommand.java
 
b/inlong-manager/manager-client-tools/src/main/java/org/apache/inlong/manager/client/cli/CreateCommand.java
index 62bc810e4..7d240f6a7 100644
--- 
a/inlong-manager/manager-client-tools/src/main/java/org/apache/inlong/manager/client/cli/CreateCommand.java
+++ 
b/inlong-manager/manager-client-tools/src/main/java/org/apache/inlong/manager/client/cli/CreateCommand.java
@@ -27,7 +27,7 @@ import 
org.apache.inlong.manager.client.cli.pojo.CreateGroupConf;
 import org.apache.inlong.manager.client.cli.util.ClientUtils;
 import org.apache.inlong.manager.client.cli.validator.UserTypeValidator;
 import org.apache.inlong.manager.common.enums.DataFormat;
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.util.JsonUtils;
 import org.apache.inlong.manager.pojo.cluster.ClusterNodeRequest;
 import org.apache.inlong.manager.pojo.cluster.ClusterRequest;
@@ -254,7 +254,7 @@ public class CreateCommand extends AbstractCommand {
                 UserRequest request = new UserRequest();
                 request.setName(username);
                 request.setPassword(password);
-                request.setAccountType(UserTypeEnum.parseName(type));
+                request.setAccountType(TenantUserTypeEnum.parseName(type));
                 request.setValidDays(validDays);
                 ClientUtils.initClientFactory();
                 UserClient userClient = 
ClientUtils.clientFactory.getUserClient();
diff --git 
a/inlong-manager/manager-client-tools/src/main/java/org/apache/inlong/manager/client/cli/ListCommand.java
 
b/inlong-manager/manager-client-tools/src/main/java/org/apache/inlong/manager/client/cli/ListCommand.java
index 617769a94..a2673d60b 100644
--- 
a/inlong-manager/manager-client-tools/src/main/java/org/apache/inlong/manager/client/cli/ListCommand.java
+++ 
b/inlong-manager/manager-client-tools/src/main/java/org/apache/inlong/manager/client/cli/ListCommand.java
@@ -36,7 +36,7 @@ import org.apache.inlong.manager.client.cli.util.PrintUtils;
 import org.apache.inlong.manager.client.cli.validator.ClusterTypeValidator;
 import org.apache.inlong.manager.client.cli.validator.UserTypeValidator;
 import org.apache.inlong.manager.common.enums.SimpleGroupStatus;
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.pojo.cluster.ClusterInfo;
 import org.apache.inlong.manager.pojo.cluster.ClusterNodeResponse;
 import org.apache.inlong.manager.pojo.cluster.ClusterPageRequest;
@@ -319,7 +319,7 @@ public class ListCommand extends AbstractCommand {
             try {
                 ClientUtils.initClientFactory();
                 UserRequest request = new UserRequest();
-                Integer integer = UserTypeEnum.parseName(type);
+                Integer integer = TenantUserTypeEnum.parseName(type);
                 request.setAccountType(integer);
                 request.setKeyword(username);
                 UserClient userClient = 
ClientUtils.clientFactory.getUserClient();
diff --git 
a/inlong-manager/manager-client-tools/src/main/java/org/apache/inlong/manager/client/cli/validator/UserTypeValidator.java
 
b/inlong-manager/manager-client-tools/src/main/java/org/apache/inlong/manager/client/cli/validator/UserTypeValidator.java
index c62e21a9f..216d66c35 100644
--- 
a/inlong-manager/manager-client-tools/src/main/java/org/apache/inlong/manager/client/cli/validator/UserTypeValidator.java
+++ 
b/inlong-manager/manager-client-tools/src/main/java/org/apache/inlong/manager/client/cli/validator/UserTypeValidator.java
@@ -17,7 +17,7 @@
 
 package org.apache.inlong.manager.client.cli.validator;
 
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 
 import com.beust.jcommander.IParameterValidator;
 import com.beust.jcommander.ParameterException;
@@ -27,7 +27,7 @@ public class UserTypeValidator implements IParameterValidator 
{
     @Override
     public void validate(String name, String value) throws ParameterException {
         try {
-            UserTypeEnum.parseName(value);
+            TenantUserTypeEnum.parseName(value);
         } catch (Exception e) {
             throw new ParameterException(e.getMessage());
         }
diff --git 
a/inlong-manager/manager-client/src/test/java/org/apache/inlong/manager/client/api/inner/ClientFactoryTest.java
 
b/inlong-manager/manager-client/src/test/java/org/apache/inlong/manager/client/api/inner/ClientFactoryTest.java
index 10ed615fd..62378840d 100644
--- 
a/inlong-manager/manager-client/src/test/java/org/apache/inlong/manager/client/api/inner/ClientFactoryTest.java
+++ 
b/inlong-manager/manager-client/src/test/java/org/apache/inlong/manager/client/api/inner/ClientFactoryTest.java
@@ -37,7 +37,7 @@ import org.apache.inlong.manager.common.consts.DataNodeType;
 import org.apache.inlong.manager.common.consts.SinkType;
 import org.apache.inlong.manager.common.consts.SourceType;
 import org.apache.inlong.manager.common.enums.ClusterType;
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.util.JsonUtils;
 import org.apache.inlong.manager.pojo.cluster.BindTagRequest;
 import org.apache.inlong.manager.pojo.cluster.ClusterInfo;
@@ -1007,7 +1007,7 @@ class ClientFactoryTest {
         request.setName("test_user");
         request.setPassword("test_pwd");
         request.setNewPassword("test_new_pwd");
-        request.setAccountType(UserTypeEnum.ADMIN.getCode());
+        request.setAccountType(TenantUserTypeEnum.TENANT_ADMIN.getCode());
         Integer userId = userClient.update(request);
         Assertions.assertEquals(userId, 1);
     }
diff --git 
a/inlong-manager/manager-client/src/test/java/org/apache/inlong/manager/client/api/inner/NoAuthClientTest.java
 
b/inlong-manager/manager-client/src/test/java/org/apache/inlong/manager/client/api/inner/NoAuthClientTest.java
index b9161566d..b5085bfc2 100644
--- 
a/inlong-manager/manager-client/src/test/java/org/apache/inlong/manager/client/api/inner/NoAuthClientTest.java
+++ 
b/inlong-manager/manager-client/src/test/java/org/apache/inlong/manager/client/api/inner/NoAuthClientTest.java
@@ -18,7 +18,7 @@
 package org.apache.inlong.manager.client.api.inner;
 
 import org.apache.inlong.manager.client.api.inner.client.NoAuthClient;
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.util.JsonUtils;
 import org.apache.inlong.manager.pojo.common.Response;
 import org.apache.inlong.manager.pojo.user.UserRequest;
@@ -49,7 +49,7 @@ public class NoAuthClientTest extends ClientFactoryTest {
         UserRequest request = UserRequest.builder()
                 .name("username")
                 .password("pwd")
-                .accountType(UserTypeEnum.ADMIN.getCode())
+                .accountType(TenantUserTypeEnum.TENANT_ADMIN.getCode())
                 .validDays(9999)
                 .build();
 
diff --git 
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/UserTypeEnum.java
 
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/TenantUserTypeEnum.java
similarity index 77%
rename from 
inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/UserTypeEnum.java
rename to 
inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/TenantUserTypeEnum.java
index 632cf81b2..97bd836b3 100644
--- 
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/UserTypeEnum.java
+++ 
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/TenantUserTypeEnum.java
@@ -27,39 +27,39 @@ import java.util.stream.Collectors;
 /**
  * User type enum
  */
-public enum UserTypeEnum implements IntListValuable {
+public enum TenantUserTypeEnum implements IntListValuable {
 
     /**
      * Has all privilege
      */
-    ADMIN(0),
+    TENANT_ADMIN(0),
     /**
      * No privilege to manage the system
      */
-    OPERATOR(1),
+    TENANT_OPERATOR(1),
     ;
 
     @Getter
     @JsonValue
     private final Integer code;
 
-    UserTypeEnum(Integer code) {
+    TenantUserTypeEnum(Integer code) {
         this.code = code;
     }
 
-    private static final List<Integer> ARRAYS = Arrays.stream(values())
-            .map(UserTypeEnum::getCode)
+    private static final List<Integer> TYPE_CODE_LIST = Arrays.stream(values())
+            .map(TenantUserTypeEnum::getCode)
             .collect(Collectors.toList());
 
-    public static UserTypeEnum parseCode(Integer value) {
-        return Arrays.stream(UserTypeEnum.class.getEnumConstants())
+    public static TenantUserTypeEnum parseCode(Integer value) {
+        return Arrays.stream(TenantUserTypeEnum.class.getEnumConstants())
                 .filter(x -> x.getCode().equals(value))
                 .findAny()
                 .orElse(null);
     }
 
     public static Integer parseName(String value) {
-        for (UserTypeEnum type : UserTypeEnum.values()) {
+        for (TenantUserTypeEnum type : TenantUserTypeEnum.values()) {
             if (type.name().equals(value)) {
                 return type.code;
             }
@@ -74,7 +74,7 @@ public enum UserTypeEnum implements IntListValuable {
 
     @Override
     public List<Integer> valueList() {
-        return ARRAYS;
+        return TYPE_CODE_LIST;
     }
 
 }
diff --git 
a/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/RoleEntity.java
 
b/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/InlongUserRoleEntity.java
similarity index 89%
copy from 
inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/RoleEntity.java
copy to 
inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/InlongUserRoleEntity.java
index 0dc41de9c..299dc42be 100644
--- 
a/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/RoleEntity.java
+++ 
b/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/InlongUserRoleEntity.java
@@ -22,17 +22,13 @@ import lombok.Data;
 import java.io.Serializable;
 import java.util.Date;
 
-/**
- * Role entity, including role code, role name, etc.
- */
 @Data
-public class RoleEntity implements Serializable {
+public class InlongUserRoleEntity implements Serializable {
 
     private static final long serialVersionUID = 1L;
     private Integer id;
+    private String username;
     private String roleCode;
-    private String roleName;
-
     private Integer disabled;
     private Integer isDeleted;
     private String creator;
@@ -40,5 +36,4 @@ public class RoleEntity implements Serializable {
     private Date createTime;
     private Date modifyTime;
     private Integer version;
-
 }
diff --git 
a/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/RoleEntityMapper.java
 
b/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/InlongUserRoleEntityMapper.java
similarity index 67%
copy from 
inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/RoleEntityMapper.java
copy to 
inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/InlongUserRoleEntityMapper.java
index a74cfcc43..8329140f3 100644
--- 
a/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/RoleEntityMapper.java
+++ 
b/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/InlongUserRoleEntityMapper.java
@@ -17,19 +17,20 @@
 
 package org.apache.inlong.manager.dao.mapper;
 
-import org.apache.inlong.manager.dao.entity.RoleEntity;
+import org.apache.inlong.manager.dao.entity.InlongUserRoleEntity;
+import org.apache.inlong.manager.pojo.user.InlongRolePageRequest;
 
+import com.github.pagehelper.Page;
 import org.springframework.stereotype.Repository;
 
 @Repository
-public interface RoleEntityMapper {
+public interface InlongUserRoleEntityMapper {
 
-    int insert(RoleEntity record);
+    int insert(InlongUserRoleEntity record);
 
-    RoleEntity selectById(Integer id);
+    InlongUserRoleEntity selectById(Integer id);
 
-    int updateById(RoleEntity record);
-
-    int deleteById(Integer id);
+    int updateById(InlongUserRoleEntity record);
 
+    Page<InlongUserRoleEntity> selectByCondition(InlongRolePageRequest 
request);
 }
diff --git 
a/inlong-manager/manager-dao/src/main/resources/mappers/InlongUserRoleEntityMapper.xml
 
b/inlong-manager/manager-dao/src/main/resources/mappers/InlongUserRoleEntityMapper.xml
new file mode 100644
index 000000000..d97d526f7
--- /dev/null
+++ 
b/inlong-manager/manager-dao/src/main/resources/mappers/InlongUserRoleEntityMapper.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements. See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License. You may obtain a copy of the License at
+  ~
+  ~ http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd";>
+<mapper 
namespace="org.apache.inlong.manager.dao.mapper.InlongUserRoleEntityMapper">
+    <resultMap id="BaseResultMap" 
type="org.apache.inlong.manager.dao.entity.InlongUserRoleEntity">
+        <id column="id" jdbcType="INTEGER" property="id"/>
+        <result column="user_name" jdbcType="VARCHAR" property="username"/>
+        <result column="role_code" jdbcType="VARCHAR" property="roleCode"/>
+        <result column="disabled" jdbcType="SMALLINT" property="disabled"/>
+        <result column="is_deleted" jdbcType="INTEGER" property="isDeleted"/>
+        <result column="creator" jdbcType="VARCHAR" property="creator"/>
+        <result column="modifier" jdbcType="VARCHAR" property="modifier"/>
+        <result column="create_time" jdbcType="TIMESTAMP" 
property="createTime"/>
+        <result column="modify_time" jdbcType="TIMESTAMP" 
property="modifyTime"/>
+        <result column="version" jdbcType="INTEGER" property="version"/>
+    </resultMap>
+    <sql id="Base_Column_List">
+        id, user_name, role_code, disabled, is_deleted, creator, modifier, 
create_time, modify_time, version
+    </sql>
+
+    <insert id="insert" useGeneratedKeys="true" keyProperty="id"
+            
parameterType="org.apache.inlong.manager.dao.entity.InlongUserRoleEntity">
+        insert into inlong_user_role (id, user_name, role_code,
+                                      disabled, creator, modifier)
+        values (#{id,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR}, 
#{roleCode,jdbcType=VARCHAR},
+                #{disabled,jdbcType=SMALLINT}, #{creator,jdbcType=VARCHAR}, 
#{modifier,jdbcType=VARCHAR})
+    </insert>
+    <select id="selectById" parameterType="java.lang.Integer" 
resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"/>
+        from inlong_user_role
+        where id = #{id,jdbcType=INTEGER}
+    </select>
+
+    <update id="updateById" 
parameterType="org.apache.inlong.manager.dao.entity.InlongUserRoleEntity">
+        update inlong_user_role
+        set user_name  = #{username,jdbcType=VARCHAR},
+            role_code  = #{roleCode,jdbcType=VARCHAR},
+            disabled   = #{disabled,jdbcType=SMALLINT},
+            is_deleted = #{isDeleted,jdbcType=INTEGER},
+            modifier   = #{modifier,jdbcType=VARCHAR},
+            version    = #{version,jdbcType=INTEGER} + 1
+        where id = #{id,jdbcType=INTEGER}
+          and version = #{version,jdbcType=INTEGER}
+    </update>
+
+    <delete id="deleteById" parameterType="java.lang.Integer">
+        delete
+        from inlong_user_role
+        where id = #{id,jdbcType=INTEGER}
+    </delete>
+
+    <select id="selectByCondition"
+            
parameterType="org.apache.inlong.manager.pojo.user.InlongRolePageRequest"
+            resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"/>
+        from inlong_user_role
+        where
+        is_deleted = 0
+        <if test="username != null and username != ''">
+            and user_name = #{username, jdbcType=VARCHAR}
+        </if>
+        <if test="roleCode != null and roleCode != ''">
+            and role_code = #{roleCode,jdbcType=VARCHAR}
+        </if>
+        <if test="disabled != null">
+            and disabled = #{disabled, jdbcType=SMALLINT}
+        </if>
+    </select>
+</mapper>
diff --git 
a/inlong-manager/manager-dao/src/main/resources/mappers/RoleEntityMapper.xml 
b/inlong-manager/manager-dao/src/main/resources/mappers/RoleEntityMapper.xml
deleted file mode 100644
index 224906f06..000000000
--- a/inlong-manager/manager-dao/src/main/resources/mappers/RoleEntityMapper.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements. See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership. The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License. You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
--->
-
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd";>
-<mapper namespace="org.apache.inlong.manager.dao.mapper.RoleEntityMapper">
-    <resultMap id="BaseResultMap" 
type="org.apache.inlong.manager.dao.entity.RoleEntity">
-        <id column="id" jdbcType="INTEGER" property="id"/>
-        <result column="role_code" jdbcType="VARCHAR" property="roleCode"/>
-        <result column="role_name" jdbcType="VARCHAR" property="roleName"/>
-        <result column="disabled" jdbcType="SMALLINT" property="disabled"/>
-        <result column="is_deleted" jdbcType="INTEGER" property="isDeleted"/>
-        <result column="creator" jdbcType="VARCHAR" property="creator"/>
-        <result column="modifier" jdbcType="VARCHAR" property="modifier"/>
-        <result column="create_time" jdbcType="TIMESTAMP" 
property="createTime"/>
-        <result column="modify_time" jdbcType="TIMESTAMP" 
property="modifyTime"/>
-        <result column="version" jdbcType="INTEGER" property="version"/>
-    </resultMap>
-    <sql id="Base_Column_List">
-        id, role_code, role_name, disabled, is_deleted, creator, modifier, 
create_time, modify_time, version
-    </sql>
-
-    <insert id="insert" useGeneratedKeys="true" keyProperty="id"
-            parameterType="org.apache.inlong.manager.dao.entity.RoleEntity">
-        insert into role (id, role_code, role_name,
-                          disabled, creator, modifier)
-        values (#{id,jdbcType=INTEGER}, #{roleCode,jdbcType=VARCHAR}, 
#{roleName,jdbcType=VARCHAR},
-                #{disabled,jdbcType=SMALLINT}, #{creator,jdbcType=VARCHAR}, 
#{modifier,jdbcType=VARCHAR})
-    </insert>
-
-    <select id="selectById" parameterType="java.lang.Integer" 
resultMap="BaseResultMap">
-        select
-        <include refid="Base_Column_List"/>
-        from role
-        where id = #{id,jdbcType=INTEGER}
-    </select>
-
-    <update id="updateById" 
parameterType="org.apache.inlong.manager.dao.entity.RoleEntity">
-        update role
-        set role_code  = #{roleCode,jdbcType=VARCHAR},
-            role_name  = #{roleName,jdbcType=VARCHAR},
-            disabled   = #{disabled,jdbcType=SMALLINT},
-            is_deleted = #{isDeleted,jdbcType=INTEGER},
-            modifier   = #{modifier,jdbcType=VARCHAR},
-            version    = #{version,jdbcType=INTEGER} + 1
-        where id = #{id,jdbcType=INTEGER}
-          and version = #{version,jdbcType=INTEGER}
-    </update>
-
-    <delete id="deleteById" parameterType="java.lang.Integer">
-        delete
-        from role
-        where id = #{id,jdbcType=INTEGER}
-    </delete>
-</mapper>
diff --git 
a/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/RoleEntity.java
 
b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/user/InlongRoleInfo.java
similarity index 50%
copy from 
inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/RoleEntity.java
copy to 
inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/user/InlongRoleInfo.java
index 0dc41de9c..797b10709 100644
--- 
a/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/RoleEntity.java
+++ 
b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/user/InlongRoleInfo.java
@@ -15,30 +15,55 @@
  * limitations under the License.
  */
 
-package org.apache.inlong.manager.dao.entity;
+package org.apache.inlong.manager.pojo.user;
 
+import org.apache.inlong.manager.common.util.CommonBeanUtils;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
 
-import java.io.Serializable;
 import java.util.Date;
 
-/**
- * Role entity, including role code, role name, etc.
- */
 @Data
-public class RoleEntity implements Serializable {
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel("Inlong user role info")
+public class InlongRoleInfo {
 
-    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "Primary key")
     private Integer id;
+
+    @ApiModelProperty(value = "User name")
+    private String username;
+
+    @ApiModelProperty(value = "Role code")
     private String roleCode;
-    private String roleName;
 
+    @ApiModelProperty(value = "If disabled")
     private Integer disabled;
-    private Integer isDeleted;
+
+    @ApiModelProperty(value = "Name of in creator")
     private String creator;
+
+    @ApiModelProperty(value = "Name of in modifier")
     private String modifier;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date modifyTime;
+
+    @ApiModelProperty(value = "Version number")
     private Integer version;
 
+    public InlongRoleRequest genRequest() {
+        return CommonBeanUtils.copyProperties(this, InlongRoleRequest::new);
+    }
 }
diff --git 
a/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/RoleEntity.java
 
b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/user/InlongRolePageRequest.java
similarity index 61%
copy from 
inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/RoleEntity.java
copy to 
inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/user/InlongRolePageRequest.java
index 0dc41de9c..944c2e570 100644
--- 
a/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/RoleEntity.java
+++ 
b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/user/InlongRolePageRequest.java
@@ -15,30 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.inlong.manager.dao.entity;
+package org.apache.inlong.manager.pojo.user;
 
-import lombok.Data;
+import org.apache.inlong.manager.pojo.common.PageRequest;
 
-import java.io.Serializable;
-import java.util.Date;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
 
-/**
- * Role entity, including role code, role name, etc.
- */
 @Data
-public class RoleEntity implements Serializable {
+@EqualsAndHashCode(callSuper = false)
+@ApiModel("Inlong user paging query request")
+public class InlongRolePageRequest extends PageRequest {
 
-    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "Primary key")
     private Integer id;
+
+    @ApiModelProperty(value = "User name")
+    private String username;
+
+    @ApiModelProperty(value = "Role code")
     private String roleCode;
-    private String roleName;
 
+    @ApiModelProperty(value = "If disabled")
     private Integer disabled;
-    private Integer isDeleted;
-    private String creator;
-    private String modifier;
-    private Date createTime;
-    private Date modifyTime;
-    private Integer version;
-
 }
diff --git 
a/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/RoleEntity.java
 
b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/user/InlongRoleRequest.java
similarity index 51%
rename from 
inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/RoleEntity.java
rename to 
inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/user/InlongRoleRequest.java
index 0dc41de9c..8df05eea5 100644
--- 
a/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/RoleEntity.java
+++ 
b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/user/InlongRoleRequest.java
@@ -15,30 +15,42 @@
  * limitations under the License.
  */
 
-package org.apache.inlong.manager.dao.entity;
+package org.apache.inlong.manager.pojo.user;
 
+import org.apache.inlong.manager.common.util.CommonBeanUtils;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
-import java.io.Serializable;
-import java.util.Date;
+import javax.validation.constraints.NotBlank;
 
-/**
- * Role entity, including role code, role name, etc.
- */
 @Data
-public class RoleEntity implements Serializable {
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel("Inlong user role request")
+public class InlongRoleRequest {
 
-    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "Primary key")
     private Integer id;
+
+    @ApiModelProperty(value = "User name")
+    @NotBlank
+    private String username;
+
+    @ApiModelProperty(value = "Role code")
+    @NotBlank
     private String roleCode;
-    private String roleName;
-
-    private Integer disabled;
-    private Integer isDeleted;
-    private String creator;
-    private String modifier;
-    private Date createTime;
-    private Date modifyTime;
+
+    @ApiModelProperty(value = "If disabled")
+    private Integer disabled = 0;
+
+    @ApiModelProperty(value = "Version number")
     private Integer version;
 
+    public InlongRoleRequest genRequest() {
+        return CommonBeanUtils.copyProperties(this, InlongRoleRequest::new);
+    }
 }
diff --git 
a/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/user/UserRequest.java
 
b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/user/UserRequest.java
index b9aab755e..3dd22f812 100644
--- 
a/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/user/UserRequest.java
+++ 
b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/user/UserRequest.java
@@ -17,7 +17,7 @@
 
 package org.apache.inlong.manager.pojo.user;
 
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.validation.InEnumInt;
 import org.apache.inlong.manager.common.validation.UpdateValidation;
 import org.apache.inlong.manager.pojo.common.PageRequest;
@@ -82,7 +82,7 @@ public class UserRequest extends PageRequest {
     private Integer encryptVersion;
 
     @NotNull(message = "accountType cannot be null")
-    @InEnumInt(UserTypeEnum.class)
+    @InEnumInt(TenantUserTypeEnum.class)
     @ApiModelProperty(value = "Account type: 0 - manager, 1 - operator", 
required = true)
     @Range(min = 0, max = 1, message = "only supports [0: manager, 1: 
operator]")
     private Integer accountType;
diff --git 
a/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/user/UserRoleCode.java
 
b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/user/UserRoleCode.java
index 6966bd1c9..e591fab23 100644
--- 
a/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/user/UserRoleCode.java
+++ 
b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/user/UserRoleCode.java
@@ -19,10 +19,55 @@ package org.apache.inlong.manager.pojo.user;
 
 /**
  * User role code.
+ *
+ * The permission control model of inlong consists of tenant permission 
control and the whole permission control.
+ *
+ * Assume that there are several resources belongs to tenant A, B and C.
+ * --------------------------------------------------------------
+ * |  Tenant   |      A     |     B      |     C    |   inlong |
+ * -------------------------------------------------------------
+ * | Resources | r1, r2, r3 | r4, r5, r6 |  r7, r8  |          |
+ * -------------------------------------------------------------
+ * |   Admin  |  Alice, Bob |  Alice,Eve |  Charlie  |   Dave  |
+ * -------------------------------------------------------------
+ * | Operator |  Charlie   |    Bob     |  Alice,Bob |   Eve   |
+ *--------------------------------------------------------------
+ * As the table shown above,
+ *
+ * Alice has all permission of tenant A and B, and she can do all 
save/update/delete/get operation to resources
+ * r1-r3 in tenant A and r4-r6 in tenant B. Alice also the operator of tenant 
C, hence she can look up r7 r8, but
+ * cannot do any modification.
+ *
+ * Bob has all permission to r1-r3, and can look up r4-r6
+ *
+ * Charlie has all permission to r7 r8, and can look up r1-r3.
+ *
+ * Dave is the admin of inlong, hence he can operate all resources r1-r8.
+ *
+ * Eve is the operator of inlong, hence she can look up all resources r1-r8,
+ * she also the admin of tenant B, hence she has all permission of r4-r6.
+ *
+ *
  */
 public class UserRoleCode {
 
-    public static final String ADMIN = "ADMIN";
-    public static final String OPERATOR = "OPERATE";
+    /**
+     * Has all permission for the resources of a specific tenant
+     */
+    public static final String TENANT_ADMIN = "TENANT_ADMIN";
+    /**
+     * Has query permission for the resources of a specific tenant
+     */
+    public static final String TENANT_OPERATOR = "TENANT_OPERATOR";
+
+    /**
+     * Has all permission for all resources
+     */
+    public static final String INLONG_ADMIN = "INLONG_ADMIN";
+
+    /**
+     * Has query permission for all resources
+     */
+    public static final String INLONG_OPERATOR = "INLONG_OPERATOR";
 
 }
diff --git 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/cluster/InlongClusterServiceImpl.java
 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/cluster/InlongClusterServiceImpl.java
index f19e7ad45..586ff4084 100644
--- 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/cluster/InlongClusterServiceImpl.java
+++ 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/cluster/InlongClusterServiceImpl.java
@@ -33,7 +33,7 @@ import org.apache.inlong.manager.common.enums.ClusterType;
 import org.apache.inlong.manager.common.enums.ErrorCodeEnum;
 import org.apache.inlong.manager.common.enums.GroupStatus;
 import org.apache.inlong.manager.common.enums.NodeStatus;
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.exceptions.BusinessException;
 import org.apache.inlong.manager.common.util.CommonBeanUtils;
 import org.apache.inlong.manager.common.util.Preconditions;
@@ -212,7 +212,7 @@ public class InlongClusterServiceImpl implements 
InlongClusterService {
         if (CollectionUtils.isNotEmpty(clusterTagEntities)) {
             for (InlongClusterTagEntity tagEntity : clusterTagEntities) {
                 // only the person in charges can query
-                if 
(!opInfo.getAccountType().equals(UserTypeEnum.ADMIN.getCode())) {
+                if 
(!opInfo.getAccountType().equals(TenantUserTypeEnum.TENANT_ADMIN.getCode())) {
                     List<String> inCharges = 
Arrays.asList(tagEntity.getInCharges().split(InlongConstants.COMMA));
                     if (!inCharges.contains(opInfo.getName())) {
                         continue;
@@ -525,7 +525,7 @@ public class InlongClusterServiceImpl implements 
InlongClusterService {
         List<InlongClusterEntity> filterResult = new ArrayList<>();
         for (InlongClusterEntity entity : clusterEntities) {
             // only the person in charges can query
-            if (!opInfo.getAccountType().equals(UserTypeEnum.ADMIN.getCode())) 
{
+            if 
(!opInfo.getAccountType().equals(TenantUserTypeEnum.TENANT_ADMIN.getCode())) {
                 List<String> inCharges = 
Arrays.asList(entity.getInCharges().split(InlongConstants.COMMA));
                 if (!inCharges.contains(opInfo.getName())) {
                     continue;
@@ -937,7 +937,7 @@ public class InlongClusterServiceImpl implements 
InlongClusterService {
                     clusterMapper.selectByKey(request.getClusterTag(), 
request.getName(), request.getType());
             for (InlongClusterEntity cluster : clusterList) {
                 // only the person in charges can query
-                if 
(!opInfo.getAccountType().equals(UserTypeEnum.ADMIN.getCode())) {
+                if 
(!opInfo.getAccountType().equals(TenantUserTypeEnum.TENANT_ADMIN.getCode())) {
                     List<String> inCharges = 
Arrays.asList(cluster.getInCharges().split(InlongConstants.COMMA));
                     if (!inCharges.contains(opInfo.getName())) {
                         continue;
diff --git 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/core/impl/AuditServiceImpl.java
 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/core/impl/AuditServiceImpl.java
index 2ac77f353..eb2fa1537 100644
--- 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/core/impl/AuditServiceImpl.java
+++ 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/core/impl/AuditServiceImpl.java
@@ -255,7 +255,7 @@ public class AuditServiceImpl implements AuditService {
     }
 
     private List<String> getAuditIds(String groupId, String streamId, String 
sinkNodeType) {
-        Set<String> auditSet = 
LoginUserUtils.getLoginUser().getRoles().contains(UserRoleCode.ADMIN)
+        Set<String> auditSet = 
LoginUserUtils.getLoginUser().getRoles().contains(UserRoleCode.TENANT_ADMIN)
                 ? new HashSet<>(auditIdListForAdmin)
                 : new HashSet<>(auditIdListForUser);
 
diff --git 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/group/GroupCheckService.java
 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/group/GroupCheckService.java
index e2bbd5731..de9efdf4f 100644
--- 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/group/GroupCheckService.java
+++ 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/group/GroupCheckService.java
@@ -19,7 +19,7 @@ package org.apache.inlong.manager.service.group;
 
 import org.apache.inlong.manager.common.enums.ErrorCodeEnum;
 import org.apache.inlong.manager.common.enums.GroupStatus;
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.exceptions.BusinessException;
 import org.apache.inlong.manager.common.util.Preconditions;
 import org.apache.inlong.manager.dao.entity.InlongGroupEntity;
@@ -59,7 +59,8 @@ public class GroupCheckService {
         UserEntity userEntity = userMapper.selectByName(operator);
         List<String> managers = 
Arrays.asList(inlongGroupEntity.getInCharges().split(","));
         Preconditions.expectTrue(
-                managers.contains(operator) || 
UserTypeEnum.ADMIN.getCode().equals(userEntity.getAccountType()),
+                managers.contains(operator)
+                        || 
TenantUserTypeEnum.TENANT_ADMIN.getCode().equals(userEntity.getAccountType()),
                 String.format(ErrorCodeEnum.USER_IS_NOT_MANAGER.getMessage(), 
operator, managers));
 
         GroupStatus status = 
GroupStatus.forCode(inlongGroupEntity.getStatus());
diff --git 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/group/InlongGroupProcessService.java
 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/group/InlongGroupProcessService.java
index 520080d30..172ed6f19 100644
--- 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/group/InlongGroupProcessService.java
+++ 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/group/InlongGroupProcessService.java
@@ -23,7 +23,7 @@ import 
org.apache.inlong.manager.common.enums.GroupOperateType;
 import org.apache.inlong.manager.common.enums.GroupStatus;
 import org.apache.inlong.manager.common.enums.ProcessName;
 import org.apache.inlong.manager.common.enums.TaskStatus;
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.exceptions.BusinessException;
 import org.apache.inlong.manager.common.exceptions.WorkflowListenerException;
 import org.apache.inlong.manager.common.util.Preconditions;
@@ -250,7 +250,7 @@ public class InlongGroupProcessService {
         InlongGroupEntity entity = groupMapper.selectByGroupId(groupId);
         Preconditions.expectNotNull(entity, ErrorCodeEnum.GROUP_NOT_FOUND, 
ErrorCodeEnum.GROUP_NOT_FOUND.getMessage());
         // only the person in charges can delete
-        if (!opInfo.getAccountType().equals(UserTypeEnum.ADMIN.getCode())) {
+        if 
(!opInfo.getAccountType().equals(TenantUserTypeEnum.TENANT_ADMIN.getCode())) {
             List<String> inCharges = 
Arrays.asList(entity.getInCharges().split(InlongConstants.COMMA));
             if (!inCharges.contains(opInfo.getName())) {
                 throw new 
BusinessException(ErrorCodeEnum.GROUP_PERMISSION_DENIED);
diff --git 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/group/InlongGroupServiceImpl.java
 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/group/InlongGroupServiceImpl.java
index 4c51b7210..0d7d4126e 100644
--- 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/group/InlongGroupServiceImpl.java
+++ 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/group/InlongGroupServiceImpl.java
@@ -22,7 +22,7 @@ import 
org.apache.inlong.manager.common.auth.SecretTokenAuthentication;
 import org.apache.inlong.manager.common.consts.InlongConstants;
 import org.apache.inlong.manager.common.enums.ErrorCodeEnum;
 import org.apache.inlong.manager.common.enums.GroupStatus;
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.exceptions.BusinessException;
 import org.apache.inlong.manager.common.util.CommonBeanUtils;
 import org.apache.inlong.manager.common.util.JsonUtils;
@@ -359,7 +359,7 @@ public class InlongGroupServiceImpl implements 
InlongGroupService {
         OrderTypeEnum.checkOrderType(request);
         for (InlongGroupEntity groupEntity : 
groupMapper.selectByCondition(request)) {
             // only the person in charges can query
-            if (!opInfo.getAccountType().equals(UserTypeEnum.ADMIN.getCode())) 
{
+            if 
(!opInfo.getAccountType().equals(TenantUserTypeEnum.TENANT_ADMIN.getCode())) {
                 List<String> inCharges = 
Arrays.asList(groupEntity.getInCharges().split(InlongConstants.COMMA));
                 if (!inCharges.contains(opInfo.getName())) {
                     continue;
diff --git 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/node/DataNodeServiceImpl.java
 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/node/DataNodeServiceImpl.java
index 10c25dca0..26de8453c 100644
--- 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/node/DataNodeServiceImpl.java
+++ 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/node/DataNodeServiceImpl.java
@@ -19,7 +19,7 @@ package org.apache.inlong.manager.service.node;
 
 import org.apache.inlong.manager.common.consts.InlongConstants;
 import org.apache.inlong.manager.common.enums.ErrorCodeEnum;
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.exceptions.BusinessException;
 import org.apache.inlong.manager.common.util.Preconditions;
 import org.apache.inlong.manager.dao.entity.DataNodeEntity;
@@ -94,7 +94,7 @@ public class DataNodeServiceImpl implements DataNodeService {
         }
 
         // only the person in charges can query
-        if (!opInfo.getAccountType().equals(UserTypeEnum.ADMIN.getCode())) {
+        if 
(!opInfo.getAccountType().equals(TenantUserTypeEnum.TENANT_ADMIN.getCode())) {
             throw new BusinessException(ErrorCodeEnum.PERMISSION_REQUIRED);
         }
         // check if data node already exist
@@ -174,7 +174,7 @@ public class DataNodeServiceImpl implements DataNodeService 
{
     @Override
     public List<DataNodeInfo> list(DataNodePageRequest request, UserInfo 
opInfo) {
         request.setCurrentUser(opInfo.getName());
-        
request.setIsAdminRole(opInfo.getRoles().contains(UserTypeEnum.ADMIN.name()));
+        
request.setIsAdminRole(opInfo.getRoles().contains(TenantUserTypeEnum.TENANT_ADMIN.name()));
         // query result
         List<DataNodeEntity> nodeEntities = 
dataNodeMapper.selectByCondition(request);
         return nodeEntities.stream()
@@ -223,7 +223,7 @@ public class DataNodeServiceImpl implements DataNodeService 
{
     @Transactional(rollbackFor = Throwable.class)
     public Boolean update(DataNodeRequest request, UserInfo opInfo) {
         // only the person in charges can query
-        if (!opInfo.getAccountType().equals(UserTypeEnum.ADMIN.getCode())) {
+        if 
(!opInfo.getAccountType().equals(TenantUserTypeEnum.TENANT_ADMIN.getCode())) {
             throw new BusinessException(ErrorCodeEnum.PERMISSION_REQUIRED);
         }
         // check the record existed
@@ -291,7 +291,7 @@ public class DataNodeServiceImpl implements DataNodeService 
{
     @Override
     public Boolean delete(Integer id, UserInfo opInfo) {
         // only the person in charges can query
-        if (!opInfo.getAccountType().equals(UserTypeEnum.ADMIN.getCode())) {
+        if 
(!opInfo.getAccountType().equals(TenantUserTypeEnum.TENANT_ADMIN.getCode())) {
             throw new BusinessException(ErrorCodeEnum.PERMISSION_REQUIRED);
         }
         DataNodeEntity entity = dataNodeMapper.selectById(id);
diff --git 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sink/StreamSinkServiceImpl.java
 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sink/StreamSinkServiceImpl.java
index 927d9cb24..e6036a33f 100644
--- 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sink/StreamSinkServiceImpl.java
+++ 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/sink/StreamSinkServiceImpl.java
@@ -22,7 +22,7 @@ import org.apache.inlong.manager.common.enums.ErrorCodeEnum;
 import org.apache.inlong.manager.common.enums.GroupStatus;
 import org.apache.inlong.manager.common.enums.SinkStatus;
 import org.apache.inlong.manager.common.enums.StreamStatus;
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.exceptions.BusinessException;
 import org.apache.inlong.manager.common.util.Preconditions;
 import org.apache.inlong.manager.dao.entity.InlongGroupEntity;
@@ -319,7 +319,7 @@ public class StreamSinkServiceImpl implements 
StreamSinkService {
     public PageResult<? extends StreamSink> listByCondition(SinkPageRequest 
request, String operator) {
         Preconditions.expectNotBlank(request.getInlongGroupId(), 
ErrorCodeEnum.GROUP_ID_IS_EMPTY);
         UserInfo userInfo = userService.getByName(operator);
-        boolean isAdmin = 
UserTypeEnum.ADMIN.getCode().equals(userInfo.getAccountType());
+        boolean isAdmin = 
TenantUserTypeEnum.TENANT_ADMIN.getCode().equals(userInfo.getAccountType());
         PageHelper.startPage(request.getPageNum(), request.getPageSize());
         OrderFieldEnum.checkOrderField(request);
         OrderTypeEnum.checkOrderType(request);
@@ -379,7 +379,7 @@ public class StreamSinkServiceImpl implements 
StreamSinkService {
                     continue;
                 }
                 // only the person in charges can query
-                if 
(!opInfo.getAccountType().equals(UserTypeEnum.ADMIN.getCode())) {
+                if 
(!opInfo.getAccountType().equals(TenantUserTypeEnum.TENANT_ADMIN.getCode())) {
                     List<String> inCharges = 
Arrays.asList(groupEntity.getInCharges().split(InlongConstants.COMMA));
                     if (!inCharges.contains(opInfo.getName())) {
                         continue;
diff --git 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/source/StreamSourceServiceImpl.java
 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/source/StreamSourceServiceImpl.java
index ab1441c5b..8dc61b262 100644
--- 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/source/StreamSourceServiceImpl.java
+++ 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/source/StreamSourceServiceImpl.java
@@ -22,7 +22,7 @@ import org.apache.inlong.manager.common.consts.SourceType;
 import org.apache.inlong.manager.common.enums.ErrorCodeEnum;
 import org.apache.inlong.manager.common.enums.GroupStatus;
 import org.apache.inlong.manager.common.enums.SourceStatus;
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.exceptions.BusinessException;
 import org.apache.inlong.manager.common.util.CommonBeanUtils;
 import org.apache.inlong.manager.common.util.Preconditions;
@@ -286,7 +286,7 @@ public class StreamSourceServiceImpl implements 
StreamSourceService {
         OrderTypeEnum.checkOrderType(request);
         List<StreamSourceEntity> entityList = 
sourceMapper.selectByCondition(request);
         List<StreamSourceEntity> filteredEntitys = Lists.newArrayList();
-        if (opInfo.getAccountType().equals(UserTypeEnum.ADMIN.getCode())) {
+        if 
(opInfo.getAccountType().equals(TenantUserTypeEnum.TENANT_ADMIN.getCode())) {
             filteredEntitys.addAll(entityList);
         } else {
             Set<String> totalGroupIds = new HashSet<>();
diff --git 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/stream/InlongStreamServiceImpl.java
 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/stream/InlongStreamServiceImpl.java
index 1c6fe4c49..e91e2fc98 100644
--- 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/stream/InlongStreamServiceImpl.java
+++ 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/stream/InlongStreamServiceImpl.java
@@ -342,7 +342,7 @@ public class InlongStreamServiceImpl implements 
InlongStreamService {
     @Override
     public List<InlongStreamBriefInfo> listBrief(InlongStreamPageRequest 
request, UserInfo opInfo) {
         request.setCurrentUser(opInfo.getName());
-        request.setIsAdminRole(opInfo.getRoles().contains(UserRoleCode.ADMIN));
+        
request.setIsAdminRole(opInfo.getRoles().contains(UserRoleCode.TENANT_ADMIN));
         OrderFieldEnum.checkOrderField(request);
         OrderTypeEnum.checkOrderType(request);
         return 
CommonBeanUtils.copyListProperties(streamMapper.selectByCondition(request), 
InlongStreamBriefInfo::new);
diff --git 
a/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/RoleEntityMapper.java
 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/user/InlongRoleService.java
similarity index 59%
rename from 
inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/RoleEntityMapper.java
rename to 
inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/user/InlongRoleService.java
index a74cfcc43..e9e98bfaa 100644
--- 
a/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/RoleEntityMapper.java
+++ 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/user/InlongRoleService.java
@@ -15,21 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.inlong.manager.dao.mapper;
+package org.apache.inlong.manager.service.user;
 
-import org.apache.inlong.manager.dao.entity.RoleEntity;
+import org.apache.inlong.manager.pojo.user.InlongRoleInfo;
+import org.apache.inlong.manager.pojo.user.InlongRolePageRequest;
+import org.apache.inlong.manager.pojo.user.InlongRoleRequest;
 
-import org.springframework.stereotype.Repository;
+import com.github.pagehelper.PageInfo;
 
-@Repository
-public interface RoleEntityMapper {
+public interface InlongRoleService {
 
-    int insert(RoleEntity record);
+    PageInfo<InlongRoleInfo> listByCondition(InlongRolePageRequest request);
 
-    RoleEntity selectById(Integer id);
+    int save(InlongRoleRequest request, String operator);
 
-    int updateById(RoleEntity record);
-
-    int deleteById(Integer id);
+    boolean update(InlongRoleRequest request, String operator);
 
+    InlongRoleInfo get(int id);
 }
diff --git 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/user/InlongRoleServiceImpl.java
 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/user/InlongRoleServiceImpl.java
new file mode 100644
index 000000000..8be93f11e
--- /dev/null
+++ 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/user/InlongRoleServiceImpl.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.inlong.manager.service.user;
+
+import org.apache.inlong.manager.common.consts.InlongConstants;
+import org.apache.inlong.manager.common.enums.ErrorCodeEnum;
+import org.apache.inlong.manager.common.exceptions.BusinessException;
+import org.apache.inlong.manager.common.util.CommonBeanUtils;
+import org.apache.inlong.manager.common.util.Preconditions;
+import org.apache.inlong.manager.dao.entity.InlongUserRoleEntity;
+import org.apache.inlong.manager.dao.mapper.InlongUserRoleEntityMapper;
+import org.apache.inlong.manager.pojo.user.InlongRoleInfo;
+import org.apache.inlong.manager.pojo.user.InlongRolePageRequest;
+import org.apache.inlong.manager.pojo.user.InlongRoleRequest;
+
+import com.github.pagehelper.Page;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class InlongRoleServiceImpl implements InlongRoleService {
+
+    @Autowired
+    private InlongUserRoleEntityMapper inlongUserMapper;
+
+    @Override
+    public PageInfo<InlongRoleInfo> listByCondition(InlongRolePageRequest 
request) {
+        PageHelper.startPage(request.getPageNum(), request.getPageSize());
+        Page<InlongUserRoleEntity> entityPage = 
inlongUserMapper.selectByCondition(request);
+        return entityPage.toPageInfo(entity -> 
CommonBeanUtils.copyProperties(entity, InlongRoleInfo::new));
+    }
+
+    @Override
+    public int save(InlongRoleRequest request, String operator) {
+        String username = request.getUsername();
+        Preconditions.expectNotBlank(username, "Failed to save inlong user 
role, user should not be blank");
+        Preconditions.expectNotBlank(request.getRoleCode(),
+                "Failed to save inlong user role, role code should not be 
blank");
+
+        InlongUserRoleEntity entity = CommonBeanUtils.copyProperties(request, 
InlongUserRoleEntity::new);
+        entity.setCreator(operator);
+        entity.setModifier(operator);
+        inlongUserMapper.insert(entity);
+        return entity.getId();
+    }
+
+    @Override
+    public boolean update(InlongRoleRequest request, String operator) {
+        InlongUserRoleEntity exist = 
inlongUserMapper.selectById(request.getId());
+        Preconditions.expectNotNull(exist, ErrorCodeEnum.RECORD_NOT_FOUND,
+                String.format("inlong user role record not found by id=%s", 
request.getId()));
+
+        InlongUserRoleEntity entity = CommonBeanUtils.copyProperties(request, 
InlongUserRoleEntity::new);
+        entity.setModifier(operator);
+        int rowCount = inlongUserMapper.updateById(entity);
+        if (rowCount != InlongConstants.AFFECTED_ONE_ROW) {
+            throw new BusinessException(ErrorCodeEnum.CONFIG_EXPIRED,
+                    String.format(
+                            "failure to update inlong user role with id=%d, 
request version=%d, updated row=%d",
+                            request.getId(), request.getVersion(), rowCount));
+        }
+        return true;
+    }
+
+    @Override
+    public InlongRoleInfo get(int id) {
+        InlongUserRoleEntity entity = inlongUserMapper.selectById(id);
+        return CommonBeanUtils.copyProperties(entity, InlongRoleInfo::new);
+    }
+}
diff --git 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/user/UserServiceImpl.java
 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/user/UserServiceImpl.java
index 12823d5a2..424f7a444 100644
--- 
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/user/UserServiceImpl.java
+++ 
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/user/UserServiceImpl.java
@@ -19,7 +19,7 @@ package org.apache.inlong.manager.service.user;
 
 import org.apache.inlong.manager.common.consts.InlongConstants;
 import org.apache.inlong.manager.common.enums.ErrorCodeEnum;
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.exceptions.BusinessException;
 import org.apache.inlong.manager.common.util.AESUtils;
 import org.apache.inlong.manager.common.util.CommonBeanUtils;
@@ -156,7 +156,7 @@ public class UserServiceImpl implements UserService {
         UserEntity entity = userMapper.selectById(userId);
         Preconditions.expectNotNull(entity, "User not exists with id " + 
userId);
         UserEntity curUser = userMapper.selectByName(currentUser);
-        Preconditions.expectTrue(Objects.equals(UserTypeEnum.ADMIN.getCode(), 
curUser.getAccountType())
+        
Preconditions.expectTrue(Objects.equals(TenantUserTypeEnum.TENANT_ADMIN.getCode(),
 curUser.getAccountType())
                 || Objects.equals(entity.getName(), currentUser),
                 "Current user does not have permission to get other users' 
info");
 
@@ -224,13 +224,13 @@ public class UserServiceImpl implements UserService {
         // Whether the current user is a manager
         UserEntity currentUserEntity = userMapper.selectByName(currentUser);
         String updateName = request.getName();
-        boolean isAdmin = Objects.equals(UserTypeEnum.ADMIN.getCode(), 
currentUserEntity.getAccountType());
+        boolean isAdmin = 
Objects.equals(TenantUserTypeEnum.TENANT_ADMIN.getCode(), 
currentUserEntity.getAccountType());
         Preconditions.expectTrue(isAdmin || Objects.equals(updateName, 
currentUser),
                 "You are not a manager and do not have permission to update 
other users");
 
         // manager cannot set himself as an ordinary
         boolean managerToOrdinary = isAdmin
-                && Objects.equals(UserTypeEnum.OPERATOR.getCode(), 
request.getAccountType())
+                && 
Objects.equals(TenantUserTypeEnum.TENANT_OPERATOR.getCode(), 
request.getAccountType())
                 && Objects.equals(currentUser, updateName);
         Preconditions.expectFalse(managerToOrdinary, "You are a manager and 
you cannot change to an ordinary user");
 
@@ -287,7 +287,7 @@ public class UserServiceImpl implements UserService {
         // Whether the current user is an administrator
         UserEntity curUser = userMapper.selectByName(currentUser);
         UserEntity entity = userMapper.selectById(userId);
-        
Preconditions.expectTrue(curUser.getAccountType().equals(UserTypeEnum.ADMIN.getCode()),
+        
Preconditions.expectTrue(curUser.getAccountType().equals(TenantUserTypeEnum.TENANT_ADMIN.getCode()),
                 "Current user is not a manager and does not have permission to 
delete users");
         Preconditions.expectTrue(!Objects.equals(entity.getName(), 
currentUser),
                 "Current user does not have permission to delete himself");
@@ -351,7 +351,8 @@ public class UserServiceImpl implements UserService {
     public void checkUser(String inCharges, String user, String errMsg) {
         UserEntity userEntity = userMapper.selectByName(user);
         boolean isInCharge = Preconditions.inSeparatedString(user, inCharges, 
InlongConstants.COMMA);
-        Preconditions.expectTrue(isInCharge || 
UserTypeEnum.ADMIN.getCode().equals(userEntity.getAccountType()),
+        Preconditions.expectTrue(
+                isInCharge || 
TenantUserTypeEnum.TENANT_ADMIN.getCode().equals(userEntity.getAccountType()),
                 errMsg);
     }
 
diff --git 
a/inlong-manager/manager-service/src/test/java/org/apache/inlong/manager/service/user/InlongRoleServiceTest.java
 
b/inlong-manager/manager-service/src/test/java/org/apache/inlong/manager/service/user/InlongRoleServiceTest.java
new file mode 100644
index 000000000..376d0a1db
--- /dev/null
+++ 
b/inlong-manager/manager-service/src/test/java/org/apache/inlong/manager/service/user/InlongRoleServiceTest.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.inlong.manager.service.user;
+
+import org.apache.inlong.manager.pojo.user.InlongRoleInfo;
+import org.apache.inlong.manager.pojo.user.InlongRolePageRequest;
+import org.apache.inlong.manager.pojo.user.InlongRoleRequest;
+import org.apache.inlong.manager.pojo.user.UserInfo;
+import org.apache.inlong.manager.pojo.user.UserRoleCode;
+import org.apache.inlong.manager.service.ServiceBaseTest;
+
+import com.github.pagehelper.PageInfo;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+class InlongRoleServiceTest extends ServiceBaseTest {
+
+    @Autowired
+    private InlongRoleService inlongRoleService;
+
+    @BeforeAll
+    public static void initUser() {
+        UserInfo userInfo = new UserInfo();
+        userInfo.setName("admin");
+        LoginUserUtils.setUserLoginInfo(userInfo);
+    }
+
+    @Test
+    @Order(1)
+    public void testSave() {
+        InlongRoleRequest request = new InlongRoleRequest();
+        request.setUsername("new admin");
+        request.setRoleCode(UserRoleCode.INLONG_ADMIN);
+        int id = inlongRoleService.save(request, 
LoginUserUtils.getLoginUser().getName());
+        InlongRoleInfo info = inlongRoleService.get(id);
+        Assertions.assertEquals(request.getRoleCode(), info.getRoleCode());
+        Assertions.assertEquals(request.getUsername(), info.getUsername());
+    }
+
+    @Test
+    @Order(2)
+    public void testUpdate() {
+        InlongRoleRequest request = new InlongRoleRequest();
+        request.setUsername("admin2");
+        request.setRoleCode(UserRoleCode.INLONG_ADMIN);
+        int id = inlongRoleService.save(request, 
LoginUserUtils.getLoginUser().getName());
+        InlongRoleInfo info = inlongRoleService.get(id);
+        info.setRoleCode(UserRoleCode.INLONG_OPERATOR);
+        inlongRoleService.update(info.genRequest(), 
LoginUserUtils.getLoginUser().getName());
+        InlongRoleInfo updatedInfo = inlongRoleService.get(id);
+        Assertions.assertEquals(UserRoleCode.INLONG_OPERATOR, 
updatedInfo.getRoleCode());
+    }
+
+    @Test
+    @Order(3)
+    public void testList() {
+        int max = 6;
+        InlongRoleRequest request = new InlongRoleRequest();
+        request.setRoleCode(UserRoleCode.INLONG_OPERATOR);
+        for (int i = 0; i < max; i++) {
+            request.setUsername("test" + i);
+            inlongRoleService.save(request, 
LoginUserUtils.getLoginUser().getName());
+        }
+        InlongRolePageRequest pageRequest = new InlongRolePageRequest();
+        pageRequest.setRoleCode(UserRoleCode.INLONG_OPERATOR);
+        PageInfo<InlongRoleInfo> infos = 
inlongRoleService.listByCondition(pageRequest);
+        Assertions.assertEquals(max, infos.getSize());
+
+        pageRequest.setRoleCode(UserRoleCode.INLONG_ADMIN);
+        infos = inlongRoleService.listByCondition(pageRequest);
+        Assertions.assertEquals(1, infos.getSize());
+    }
+}
\ No newline at end of file
diff --git 
a/inlong-manager/manager-service/src/test/java/org/apache/inlong/manager/service/user/TenantRoleServiceTest.java
 
b/inlong-manager/manager-service/src/test/java/org/apache/inlong/manager/service/user/TenantRoleServiceTest.java
index 9487868f9..63f30a1ad 100644
--- 
a/inlong-manager/manager-service/src/test/java/org/apache/inlong/manager/service/user/TenantRoleServiceTest.java
+++ 
b/inlong-manager/manager-service/src/test/java/org/apache/inlong/manager/service/user/TenantRoleServiceTest.java
@@ -51,7 +51,7 @@ public class TenantRoleServiceTest extends ServiceBaseTest {
     public void testSaveWithoutTenant() {
         TenantRoleRequest request = new TenantRoleRequest();
         request.setTenant("not exist tenant");
-        request.setRoleCode(UserRoleCode.ADMIN);
+        request.setRoleCode(UserRoleCode.TENANT_ADMIN);
         request.setUsername(LoginUserUtils.getLoginUser().getName());
         int code = -1;
         try {
@@ -68,7 +68,7 @@ public class TenantRoleServiceTest extends ServiceBaseTest {
         TenantRoleRequest request = new TenantRoleRequest();
         request.setTenant("public");
         request.setUsername(LoginUserUtils.getLoginUser().getName());
-        request.setRoleCode(UserRoleCode.ADMIN);
+        request.setRoleCode(UserRoleCode.TENANT_ADMIN);
         int id = service.save(request, 
LoginUserUtils.getLoginUser().getName());
         TenantRoleInfo info = service.get(id);
         Assertions.assertEquals(request.getTenant(), info.getTenant());
@@ -83,13 +83,13 @@ public class TenantRoleServiceTest extends ServiceBaseTest {
         TenantRoleRequest request = new TenantRoleRequest();
         request.setTenant("public");
         request.setUsername(newUser);
-        request.setRoleCode(UserRoleCode.ADMIN);
+        request.setRoleCode(UserRoleCode.TENANT_ADMIN);
         int id = service.save(request, 
LoginUserUtils.getLoginUser().getName());
         TenantRoleInfo oldInfo = service.get(id);
-        oldInfo.setRoleCode(UserRoleCode.OPERATOR);
+        oldInfo.setRoleCode(UserRoleCode.TENANT_OPERATOR);
         service.update(oldInfo.genRequest(), 
LoginUserUtils.getLoginUser().getName());
         TenantRoleInfo newInfo = service.get(id);
-        Assertions.assertEquals(UserRoleCode.OPERATOR, newInfo.getRoleCode());
+        Assertions.assertEquals(UserRoleCode.TENANT_OPERATOR, 
newInfo.getRoleCode());
     }
 
     @Test
@@ -98,7 +98,7 @@ public class TenantRoleServiceTest extends ServiceBaseTest {
         int max = 5;
         TenantRoleRequest request = new TenantRoleRequest();
         request.setTenant("public");
-        request.setRoleCode(UserRoleCode.OPERATOR);
+        request.setRoleCode(UserRoleCode.TENANT_OPERATOR);
         for (int i = 0; i < max; i++) {
             request.setUsername("testName" + i);
             service.save(request, LoginUserUtils.getLoginUser().getName());
diff --git 
a/inlong-manager/manager-test/src/main/resources/h2/apache_inlong_manager.sql 
b/inlong-manager/manager-test/src/main/resources/h2/apache_inlong_manager.sql
index 562986fd5..8dd5bbd37 100644
--- 
a/inlong-manager/manager-test/src/main/resources/h2/apache_inlong_manager.sql
+++ 
b/inlong-manager/manager-test/src/main/resources/h2/apache_inlong_manager.sql
@@ -529,7 +529,7 @@ CREATE TABLE IF NOT EXISTS `role`
 );
 
 -- ----------------------------
--- Table structure for user_role
+-- Table structure for tenant user_role
 -- ----------------------------
 CREATE TABLE IF NOT EXISTS `tenant_user_role`
 (
@@ -549,6 +549,28 @@ CREATE TABLE IF NOT EXISTS `tenant_user_role`
     INDEX `index_tenant` (`tenant`, `is_deleted`)
 );
 
+-- ----------------------------
+-- Table structure for inlong_user_role
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `inlong_user_role`
+(
+    `id`          int(11)      NOT NULL AUTO_INCREMENT,
+    `user_name`   varchar(256) NOT NULL COMMENT 'Username',
+    `role_code`   varchar(256) NOT NULL COMMENT 'User role code',
+    `disabled`    tinyint(1)   NOT NULL DEFAULT '0' COMMENT 'Whether to 
disabled, 0: enabled, 1: disabled',
+    `is_deleted`  int(11)               DEFAULT '0' COMMENT 'Whether to 
delete, 0 is not deleted, if greater than 0, delete',
+    `creator`     varchar(256) NOT NULL COMMENT 'Creator name',
+    `modifier`    varchar(256)          DEFAULT NULL COMMENT 'Modifier name',
+    `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 
'Create time',
+    `modify_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE 
CURRENT_TIMESTAMP COMMENT 'Modify time',
+    `version`     int(11)      NOT NULL DEFAULT '1' COMMENT 'Version number, 
which will be incremented by 1 after modification',
+    PRIMARY KEY (`id`),
+    UNIQUE KEY `unique_inlong_user_role` (`user_name`, `role_code`, 
`is_deleted`)
+);
+
+INSERT INTO `inlong_user_role` (`user_name`, `role_code`, `creator`)
+VALUES ('admin', 'INLONG_ADMIN', 'inlong_init');
+
 -- ----------------------------
 -- Table structure for workflow_approver
 -- ----------------------------
diff --git a/inlong-manager/manager-web/sql/apache_inlong_manager.sql 
b/inlong-manager/manager-web/sql/apache_inlong_manager.sql
index 3573569c3..580d33b7b 100644
--- a/inlong-manager/manager-web/sql/apache_inlong_manager.sql
+++ b/inlong-manager/manager-web/sql/apache_inlong_manager.sql
@@ -583,6 +583,29 @@ CREATE TABLE IF NOT EXISTS `tenant_user_role`
 ) ENGINE = InnoDB
   DEFAULT CHARSET = utf8mb4 COMMENT ='Tenant User Role Table';
 
+-- ----------------------------
+-- Table structure for inlong_user_role
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `inlong_user_role`
+(
+    `id`          int(11)      NOT NULL AUTO_INCREMENT,
+    `user_name`   varchar(256) NOT NULL COMMENT 'Username',
+    `role_code`   varchar(256) NOT NULL COMMENT 'User role code',
+    `disabled`    tinyint(1)   NOT NULL DEFAULT '0' COMMENT 'Whether to 
disabled, 0: enabled, 1: disabled',
+    `is_deleted`  int(11)               DEFAULT '0' COMMENT 'Whether to 
delete, 0 is not deleted, if greater than 0, delete',
+    `creator`     varchar(256) NOT NULL COMMENT 'Creator name',
+    `modifier`    varchar(256)          DEFAULT NULL COMMENT 'Modifier name',
+    `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 
'Create time',
+    `modify_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE 
CURRENT_TIMESTAMP COMMENT 'Modify time',
+    `version`     int(11)      NOT NULL DEFAULT '1' COMMENT 'Version number, 
which will be incremented by 1 after modification',
+    PRIMARY KEY (`id`),
+    UNIQUE KEY `unique_inlong_user_role` (`user_name`, `role_code`, 
`is_deleted`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT ='Inlong User Role Table';
+
+INSERT INTO `inlong_user_role` (`user_name`, `role_code`, `creator`)
+VALUES ('admin', 'INLONG_ADMIN', 'inlong_init');
+
 -- ----------------------------
 -- Table structure for workflow_approver
 -- ----------------------------
diff --git a/inlong-manager/manager-web/sql/changes-1.8.0.sql 
b/inlong-manager/manager-web/sql/changes-1.8.0.sql
index 86e708c20..08b005b88 100644
--- a/inlong-manager/manager-web/sql/changes-1.8.0.sql
+++ b/inlong-manager/manager-web/sql/changes-1.8.0.sql
@@ -46,12 +46,32 @@ CREATE TABLE IF NOT EXISTS `inlong_tenant`
 INSERT INTO `inlong_tenant`(`name`, `description`, `creator`, `modifier`)
 VALUES ('public', 'Default tenant', 'inlong_init', 'inlong_init');
 
--- To support distinguish inlong user permission and tenant permission 
control, please see https://github.com/apache/inlong/issues/8118
+-- To support distinguish inlong user permission and tenant permission 
control, please see https://github.com/apache/inlong/issues/8098
+CREATE TABLE IF NOT EXISTS `inlong_user_role`
+(
+    `id`          int(11)      NOT NULL AUTO_INCREMENT,
+    `user_name`   varchar(256) NOT NULL COMMENT 'Username',
+    `role_code`   varchar(256) NOT NULL COMMENT 'User role code',
+    `disabled`    tinyint(1)   NOT NULL DEFAULT '0' COMMENT 'Whether to 
disabled, 0: enabled, 1: disabled',
+    `is_deleted`  int(11)               DEFAULT '0' COMMENT 'Whether to 
delete, 0 is not deleted, if greater than 0, delete',
+    `creator`     varchar(256) NOT NULL COMMENT 'Creator name',
+    `modifier`    varchar(256)          DEFAULT NULL COMMENT 'Modifier name',
+    `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 
'Create time',
+    `modify_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE 
CURRENT_TIMESTAMP COMMENT 'Modify time',
+    `version`     int(11)      NOT NULL DEFAULT '1' COMMENT 'Version number, 
which will be incremented by 1 after modification',
+    PRIMARY KEY (`id`),
+    UNIQUE KEY `unique_inlong_user_role` (`user_name`, `role_code`, 
`is_deleted`)
+    ) ENGINE = InnoDB
+    DEFAULT CHARSET = utf8mb4 COMMENT ='Inlong User Role Table';
+
+INSERT INTO `inlong_user_role` (`user_name`, `role_code`, `creator`)
+VALUES ('admin', 'INLONG_ADMIN', 'inlong_init');
+
 RENAME TABLE user_role TO tenant_user_role;
 ALTER TABLE tenant_user_role
     ADD tenant VARCHAR(256) DEFAULT 'public' NOT NULL comment 'User tenant';
 ALTER TABLE tenant_user_role
     ADD CONSTRAINT unique_tenant_user
         UNIQUE (user_name, tenant, is_deleted);
-CREATE INDEX tenant_user_role
-    ON user_role (tenant);
+CREATE INDEX index_tenant
+    ON tenant_user_role (tenant, is_deleted);
diff --git 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/OpenAPIAuthenticatingRealm.java
 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/OpenAPIAuthenticatingRealm.java
index 063e64216..4e65e2c2b 100644
--- 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/OpenAPIAuthenticatingRealm.java
+++ 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/OpenAPIAuthenticatingRealm.java
@@ -17,7 +17,7 @@
 
 package org.apache.inlong.manager.web.auth.openapi;
 
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.util.AESUtils;
 import org.apache.inlong.manager.common.util.Preconditions;
 import org.apache.inlong.manager.pojo.user.UserInfo;
@@ -60,8 +60,8 @@ public class OpenAPIAuthenticatingRealm extends 
AuthenticatingRealm {
             String secretKey = new String(
                     AESUtils.decryptAsString(userInfo.getSecretKey(), 
userInfo.getEncryptVersion()));
             userInfo.setRoles(Sets.newHashSet(userInfo.getAccountType() == 0
-                    ? UserTypeEnum.ADMIN.name()
-                    : UserTypeEnum.OPERATOR.name()));
+                    ? TenantUserTypeEnum.TENANT_ADMIN.name()
+                    : TenantUserTypeEnum.TENANT_OPERATOR.name()));
             return new SimpleAuthenticationInfo(userInfo, secretKey, 
getName());
         } catch (Exception e) {
             log.error("decrypt secret key fail: ", e);
diff --git 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/web/WebAuthorizingRealm.java
 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/web/WebAuthorizingRealm.java
index 1c263388e..08aff0e5c 100644
--- 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/web/WebAuthorizingRealm.java
+++ 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/web/WebAuthorizingRealm.java
@@ -17,7 +17,7 @@
 
 package org.apache.inlong.manager.web.auth.web;
 
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.util.Preconditions;
 import org.apache.inlong.manager.pojo.user.UserInfo;
 import org.apache.inlong.manager.service.user.UserService;
@@ -57,8 +57,8 @@ public class WebAuthorizingRealm extends AuthorizingRealm {
         Preconditions.expectNotNull(userInfo, "User not exist with name=" + 
username);
         Preconditions.expectTrue(userInfo.getDueDate().after(new Date()), 
"User " + username + " was expired");
         userInfo.setRoles(Sets.newHashSet(userInfo.getAccountType() == 0
-                ? UserTypeEnum.ADMIN.name()
-                : UserTypeEnum.OPERATOR.name()));
+                ? TenantUserTypeEnum.TENANT_ADMIN.name()
+                : TenantUserTypeEnum.TENANT_OPERATOR.name()));
         return new SimpleAuthenticationInfo(userInfo, userInfo.getPassword(), 
getName());
     }
 
diff --git 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/AnnoController.java
 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/AnnoController.java
index de15893c4..77e2147de 100644
--- 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/AnnoController.java
+++ 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/AnnoController.java
@@ -55,7 +55,7 @@ public class AnnoController {
     }
 
     @PostMapping("/anno/register")
-    @RequiresRoles(value = UserRoleCode.ADMIN)
+    @RequiresRoles(value = UserRoleCode.TENANT_ADMIN)
     public Response<Integer> register(@Validated @RequestBody UserRequest 
request) {
         String currentUser = LoginUserUtils.getLoginUser().getName();
         return Response.success(userService.save(request, currentUser));
diff --git 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/DataNodeController.java
 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/DataNodeController.java
index be4a1b891..31664b675 100644
--- 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/DataNodeController.java
+++ 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/DataNodeController.java
@@ -18,7 +18,7 @@
 package org.apache.inlong.manager.web.controller;
 
 import org.apache.inlong.manager.common.enums.OperationType;
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.validation.SaveValidation;
 import org.apache.inlong.manager.common.validation.UpdateByIdValidation;
 import org.apache.inlong.manager.common.validation.UpdateByKeyValidation;
@@ -63,7 +63,7 @@ public class DataNodeController {
     @PostMapping(value = "/node/save")
     @ApiOperation(value = "Save node")
     @OperationLog(operation = OperationType.CREATE)
-    @RequiresRoles(value = UserRoleCode.ADMIN)
+    @RequiresRoles(value = UserRoleCode.TENANT_ADMIN)
     public Response<Integer> save(@Validated(SaveValidation.class) 
@RequestBody DataNodeRequest request) {
         String currentUser = LoginUserUtils.getLoginUser().getName();
         return Response.success(dataNodeService.save(request, currentUser));
@@ -81,7 +81,8 @@ public class DataNodeController {
     @ApiOperation(value = "List data node")
     public Response<PageResult<DataNodeInfo>> list(@RequestBody 
DataNodePageRequest request) {
         request.setCurrentUser(LoginUserUtils.getLoginUser().getName());
-        
request.setIsAdminRole(LoginUserUtils.getLoginUser().getRoles().contains(UserTypeEnum.ADMIN.name()));
+        request.setIsAdminRole(
+                
LoginUserUtils.getLoginUser().getRoles().contains(TenantUserTypeEnum.TENANT_ADMIN.name()));
         return Response.success(dataNodeService.list(request));
     }
 
@@ -106,7 +107,7 @@ public class DataNodeController {
     @ApiOperation(value = "Delete data node by id")
     @OperationLog(operation = OperationType.DELETE)
     @ApiImplicitParam(name = "id", value = "Data node ID", dataTypeClass = 
Integer.class, required = true)
-    @RequiresRoles(value = UserRoleCode.ADMIN)
+    @RequiresRoles(value = UserRoleCode.TENANT_ADMIN)
     public Response<Boolean> delete(@PathVariable Integer id) {
         return Response.success(dataNodeService.delete(id, 
LoginUserUtils.getLoginUser().getName()));
     }
@@ -118,7 +119,7 @@ public class DataNodeController {
             @ApiImplicitParam(name = "name", value = "Data node name", 
dataTypeClass = String.class, required = true),
             @ApiImplicitParam(name = "type", value = "Data node type", 
dataTypeClass = String.class, required = true)
     })
-    @RequiresRoles(value = UserRoleCode.ADMIN)
+    @RequiresRoles(value = UserRoleCode.TENANT_ADMIN)
     public Response<Boolean> deleteByKey(@RequestParam String name, 
@RequestParam String type) {
         return Response.success(dataNodeService.deleteByKey(name, type,
                 LoginUserUtils.getLoginUser().getName()));
diff --git 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongClusterController.java
 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongClusterController.java
index e6e661f45..3c65557db 100644
--- 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongClusterController.java
+++ 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongClusterController.java
@@ -18,7 +18,7 @@
 package org.apache.inlong.manager.web.controller;
 
 import org.apache.inlong.manager.common.enums.OperationType;
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.validation.SaveValidation;
 import org.apache.inlong.manager.common.validation.UpdateByIdValidation;
 import org.apache.inlong.manager.common.validation.UpdateByKeyValidation;
@@ -73,7 +73,7 @@ public class InlongClusterController {
     @PostMapping(value = "/cluster/tag/save")
     @ApiOperation(value = "Save cluster tag")
     @OperationLog(operation = OperationType.CREATE)
-    @RequiresRoles(value = UserRoleCode.ADMIN)
+    @RequiresRoles(value = UserRoleCode.TENANT_ADMIN)
     public Response<Integer> saveTag(@Validated(SaveValidation.class) 
@RequestBody ClusterTagRequest request) {
         String currentUser = LoginUserUtils.getLoginUser().getName();
         return Response.success(clusterService.saveTag(request, currentUser));
@@ -91,7 +91,8 @@ public class InlongClusterController {
     @ApiOperation(value = "List cluster tags")
     public Response<PageResult<ClusterTagResponse>> listTag(@RequestBody 
ClusterTagPageRequest request) {
         request.setCurrentUser(LoginUserUtils.getLoginUser().getName());
-        
request.setIsAdminRole(LoginUserUtils.getLoginUser().getRoles().contains(UserTypeEnum.ADMIN.name()));
+        request.setIsAdminRole(
+                
LoginUserUtils.getLoginUser().getRoles().contains(TenantUserTypeEnum.TENANT_ADMIN.name()));
         return Response.success(clusterService.listTag(request));
     }
 
@@ -107,7 +108,7 @@ public class InlongClusterController {
     @ApiOperation(value = "Delete cluster tag by id")
     @OperationLog(operation = OperationType.DELETE)
     @ApiImplicitParam(name = "id", value = "Cluster tag ID", dataTypeClass = 
Integer.class, required = true)
-    @RequiresRoles(value = UserRoleCode.ADMIN)
+    @RequiresRoles(value = UserRoleCode.TENANT_ADMIN)
     public Response<Boolean> deleteTag(@PathVariable Integer id) {
         return Response.success(clusterService.deleteTag(id, 
LoginUserUtils.getLoginUser().getName()));
     }
@@ -115,7 +116,7 @@ public class InlongClusterController {
     @PostMapping(value = "/cluster/save")
     @ApiOperation(value = "Save cluster")
     @OperationLog(operation = OperationType.CREATE)
-    @RequiresRoles(value = UserRoleCode.ADMIN)
+    @RequiresRoles(value = UserRoleCode.TENANT_ADMIN)
     public Response<Integer> save(@Validated(SaveValidation.class) 
@RequestBody ClusterRequest request) {
         String currentUser = LoginUserUtils.getLoginUser().getName();
         return Response.success(clusterService.save(request, currentUser));
@@ -133,7 +134,8 @@ public class InlongClusterController {
     @ApiOperation(value = "List clusters")
     public Response<PageResult<ClusterInfo>> list(@RequestBody 
ClusterPageRequest request) {
         request.setCurrentUser(LoginUserUtils.getLoginUser().getName());
-        
request.setIsAdminRole(LoginUserUtils.getLoginUser().getRoles().contains(UserTypeEnum.ADMIN.name()));
+        request.setIsAdminRole(
+                
LoginUserUtils.getLoginUser().getRoles().contains(TenantUserTypeEnum.TENANT_ADMIN.name()));
         return Response.success(clusterService.list(request));
     }
 
@@ -166,7 +168,7 @@ public class InlongClusterController {
     @ApiOperation(value = "Delete cluster by id")
     @OperationLog(operation = OperationType.DELETE)
     @ApiImplicitParam(name = "id", value = "Cluster ID", dataTypeClass = 
Integer.class, required = true)
-    @RequiresRoles(value = UserRoleCode.ADMIN)
+    @RequiresRoles(value = UserRoleCode.TENANT_ADMIN)
     public Response<Boolean> delete(@PathVariable Integer id) {
         return Response.success(clusterService.delete(id, 
LoginUserUtils.getLoginUser().getName()));
     }
@@ -178,7 +180,7 @@ public class InlongClusterController {
             @ApiImplicitParam(name = "name", value = "Cluster name", 
dataTypeClass = String.class, required = true),
             @ApiImplicitParam(name = "type", value = "Cluster type", 
dataTypeClass = String.class, required = true),
     })
-    @RequiresRoles(value = UserRoleCode.ADMIN)
+    @RequiresRoles(value = UserRoleCode.TENANT_ADMIN)
     public Response<Boolean> deleteByKey(@RequestParam String name, 
@RequestParam String type) {
         return Response.success(clusterService.deleteByKey(name, type,
                 LoginUserUtils.getLoginUser().getName()));
diff --git 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongConsumeController.java
 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongConsumeController.java
index 144097c3a..faf6589ad 100644
--- 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongConsumeController.java
+++ 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongConsumeController.java
@@ -18,7 +18,7 @@
 package org.apache.inlong.manager.web.controller;
 
 import org.apache.inlong.manager.common.enums.OperationType;
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.validation.UpdateValidation;
 import org.apache.inlong.manager.pojo.common.PageResult;
 import org.apache.inlong.manager.pojo.common.Response;
@@ -85,7 +85,8 @@ public class InlongConsumeController {
     @ApiOperation(value = "List inlong consume by pagination")
     public Response<PageResult<InlongConsumeBriefInfo>> list(@RequestBody 
InlongConsumePageRequest request) {
         request.setCurrentUser(LoginUserUtils.getLoginUser().getName());
-        
request.setIsAdminRole(LoginUserUtils.getLoginUser().getRoles().contains(UserTypeEnum.ADMIN.name()));
+        request.setIsAdminRole(
+                
LoginUserUtils.getLoginUser().getRoles().contains(TenantUserTypeEnum.TENANT_ADMIN.name()));
         return Response.success(consumeService.list(request));
     }
 
diff --git 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongGroupController.java
 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongGroupController.java
index 706f862d9..dc6feaf52 100644
--- 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongGroupController.java
+++ 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongGroupController.java
@@ -18,7 +18,7 @@
 package org.apache.inlong.manager.web.controller;
 
 import org.apache.inlong.manager.common.enums.OperationType;
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.validation.SaveValidation;
 import org.apache.inlong.manager.common.validation.UpdateValidation;
 import org.apache.inlong.manager.pojo.common.PageResult;
@@ -120,7 +120,8 @@ public class InlongGroupController {
     @ApiOperation(value = "List inlong groups by paginating")
     public Response<PageResult<InlongGroupBriefInfo>> listBrief(@RequestBody 
InlongGroupPageRequest request) {
         request.setCurrentUser(LoginUserUtils.getLoginUser().getName());
-        
request.setIsAdminRole(LoginUserUtils.getLoginUser().getRoles().contains(UserTypeEnum.ADMIN.name()));
+        request.setIsAdminRole(
+                
LoginUserUtils.getLoginUser().getRoles().contains(TenantUserTypeEnum.TENANT_ADMIN.name()));
         return Response.success(groupService.listBrief(request));
     }
 
diff --git 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongTenantRoleController.java
 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongRoleController.java
similarity index 58%
copy from 
inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongTenantRoleController.java
copy to 
inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongRoleController.java
index c10ccd69b..b5aa8bac6 100644
--- 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongTenantRoleController.java
+++ 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongRoleController.java
@@ -19,13 +19,13 @@ package org.apache.inlong.manager.web.controller;
 
 import org.apache.inlong.manager.common.enums.OperationType;
 import org.apache.inlong.manager.pojo.common.Response;
-import org.apache.inlong.manager.pojo.user.TenantRoleInfo;
-import org.apache.inlong.manager.pojo.user.TenantRolePageRequest;
-import org.apache.inlong.manager.pojo.user.TenantRoleRequest;
+import org.apache.inlong.manager.pojo.user.InlongRoleInfo;
+import org.apache.inlong.manager.pojo.user.InlongRolePageRequest;
+import org.apache.inlong.manager.pojo.user.InlongRoleRequest;
 import org.apache.inlong.manager.pojo.user.UserRoleCode;
 import org.apache.inlong.manager.service.operationlog.OperationLog;
+import org.apache.inlong.manager.service.user.InlongRoleService;
 import org.apache.inlong.manager.service.user.LoginUserUtils;
-import org.apache.inlong.manager.service.user.TenantRoleService;
 
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
@@ -42,42 +42,41 @@ import 
org.springframework.web.bind.annotation.RestController;
 
 @RestController
 @RequestMapping("/api")
-@Api(tags = "Tenant-API")
-public class InlongTenantRoleController {
+@Api(tags = "INLONG-USER-API")
+public class InlongRoleController {
 
     @Autowired
-    private TenantRoleService tenantRoleService;
+    private InlongRoleService inlongRoleService;
 
-    @RequestMapping(value = "/role/tenant/get/{id}", method = 
RequestMethod.GET)
-    @ApiOperation(value = "Get tenant role")
+    @RequestMapping(value = "/role/inlong/get/{id}", method = 
RequestMethod.GET)
+    @ApiOperation(value = "Get inlong role")
+    @RequiresRoles(value = UserRoleCode.INLONG_ADMIN)
     @ApiImplicitParam(name = "id", dataTypeClass = Integer.class, required = 
true)
-    @RequiresRoles(value = UserRoleCode.ADMIN)
-    public Response<TenantRoleInfo> get(@PathVariable int id) {
-        return Response.success(tenantRoleService.get(id));
+    public Response<InlongRoleInfo> get(@PathVariable int id) {
+        return Response.success(inlongRoleService.get(id));
     }
 
-    @RequestMapping(value = "/role/tenant/save", method = RequestMethod.POST)
+    @RequestMapping(value = "/role/inlong/save", method = RequestMethod.POST)
     @OperationLog(operation = OperationType.CREATE)
-    @ApiOperation(value = "Save tenant role")
-    @RequiresRoles(value = UserRoleCode.ADMIN)
-    public Response<Integer> save(@Validated @RequestBody TenantRoleRequest 
request) {
+    @RequiresRoles(value = UserRoleCode.INLONG_ADMIN)
+    @ApiOperation(value = "Save inlong role")
+    public Response<Integer> save(@Validated @RequestBody InlongRoleRequest 
request) {
         String operator = LoginUserUtils.getLoginUser().getName();
-        return Response.success(tenantRoleService.save(request, operator));
+        return Response.success(inlongRoleService.save(request, operator));
     }
 
-    @RequestMapping(value = "/role/tenant/update", method = RequestMethod.POST)
-    @OperationLog(operation = OperationType.CREATE)
-    @ApiOperation(value = "Update tenant role")
-    @RequiresRoles(value = UserRoleCode.ADMIN)
-    public Response<Boolean> update(@Validated @RequestBody TenantRoleRequest 
request) {
+    @RequestMapping(value = "/role/inlong/update", method = RequestMethod.POST)
+    @OperationLog(operation = OperationType.UPDATE)
+    @RequiresRoles(value = UserRoleCode.INLONG_ADMIN)
+    @ApiOperation(value = "Save inlong role")
+    public Response<Boolean> update(@Validated @RequestBody InlongRoleRequest 
request) {
         String operator = LoginUserUtils.getLoginUser().getName();
-        return Response.success(tenantRoleService.update(request, operator));
+        return Response.success(inlongRoleService.update(request, operator));
     }
 
-    @RequestMapping(value = "/role/tenant/list", method = RequestMethod.POST)
-    @ApiOperation(value = "List tenant roles by paginating")
-    public Response<PageInfo<TenantRoleInfo>> listByCondition(@RequestBody 
TenantRolePageRequest request) {
-        return Response.success(tenantRoleService.listByCondition(request));
+    @RequestMapping(value = "/role/inlong/list", method = RequestMethod.POST)
+    @ApiOperation(value = "List inlong roles by paginating")
+    public Response<PageInfo<InlongRoleInfo>> listByCondition(@RequestBody 
InlongRolePageRequest request) {
+        return Response.success(inlongRoleService.listByCondition(request));
     }
-
 }
diff --git 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongStreamController.java
 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongStreamController.java
index 84b9dd331..e2e8cf3eb 100644
--- 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongStreamController.java
+++ 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongStreamController.java
@@ -111,7 +111,7 @@ public class InlongStreamController {
     @ApiOperation(value = "List inlong stream briefs by paginating")
     public Response<PageResult<InlongStreamBriefInfo>> 
listByCondition(@RequestBody InlongStreamPageRequest request) {
         request.setCurrentUser(LoginUserUtils.getLoginUser().getName());
-        
request.setIsAdminRole(LoginUserUtils.getLoginUser().getRoles().contains(UserRoleCode.ADMIN));
+        
request.setIsAdminRole(LoginUserUtils.getLoginUser().getRoles().contains(UserRoleCode.TENANT_ADMIN));
         return Response.success(streamService.listBrief(request));
     }
 
@@ -119,7 +119,7 @@ public class InlongStreamController {
     @ApiOperation(value = "List inlong streams with sources and sinks by 
paginating")
     public Response<PageResult<InlongStreamInfo>> 
listAllWithGroupId(@RequestBody InlongStreamPageRequest request) {
         request.setCurrentUser(LoginUserUtils.getLoginUser().getName());
-        
request.setIsAdminRole(LoginUserUtils.getLoginUser().getRoles().contains(UserRoleCode.ADMIN));
+        
request.setIsAdminRole(LoginUserUtils.getLoginUser().getRoles().contains(UserRoleCode.TENANT_ADMIN));
         return Response.success(streamService.listAll(request));
     }
 
diff --git 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongTenantRoleController.java
 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongTenantRoleController.java
index c10ccd69b..751b8433e 100644
--- 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongTenantRoleController.java
+++ 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongTenantRoleController.java
@@ -51,7 +51,7 @@ public class InlongTenantRoleController {
     @RequestMapping(value = "/role/tenant/get/{id}", method = 
RequestMethod.GET)
     @ApiOperation(value = "Get tenant role")
     @ApiImplicitParam(name = "id", dataTypeClass = Integer.class, required = 
true)
-    @RequiresRoles(value = UserRoleCode.ADMIN)
+    @RequiresRoles(value = UserRoleCode.TENANT_ADMIN)
     public Response<TenantRoleInfo> get(@PathVariable int id) {
         return Response.success(tenantRoleService.get(id));
     }
@@ -59,7 +59,7 @@ public class InlongTenantRoleController {
     @RequestMapping(value = "/role/tenant/save", method = RequestMethod.POST)
     @OperationLog(operation = OperationType.CREATE)
     @ApiOperation(value = "Save tenant role")
-    @RequiresRoles(value = UserRoleCode.ADMIN)
+    @RequiresRoles(value = UserRoleCode.TENANT_ADMIN)
     public Response<Integer> save(@Validated @RequestBody TenantRoleRequest 
request) {
         String operator = LoginUserUtils.getLoginUser().getName();
         return Response.success(tenantRoleService.save(request, operator));
@@ -68,7 +68,7 @@ public class InlongTenantRoleController {
     @RequestMapping(value = "/role/tenant/update", method = RequestMethod.POST)
     @OperationLog(operation = OperationType.CREATE)
     @ApiOperation(value = "Update tenant role")
-    @RequiresRoles(value = UserRoleCode.ADMIN)
+    @RequiresRoles(value = UserRoleCode.TENANT_ADMIN)
     public Response<Boolean> update(@Validated @RequestBody TenantRoleRequest 
request) {
         String operator = LoginUserUtils.getLoginUser().getName();
         return Response.success(tenantRoleService.update(request, operator));
diff --git 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/UserController.java
 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/UserController.java
index 4f2795ff3..68a5001c7 100644
--- 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/UserController.java
+++ 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/UserController.java
@@ -59,7 +59,7 @@ public class UserController {
 
     @PostMapping("/user/register")
     @ApiOperation(value = "Register user")
-    @RequiresRoles(value = UserRoleCode.ADMIN)
+    @RequiresRoles(value = UserRoleCode.TENANT_ADMIN)
     public Response<Integer> register(@Validated @RequestBody UserRequest 
userInfo) {
         String currentUser = LoginUserUtils.getLoginUser().getName();
         return Response.success(userService.save(userInfo, currentUser));
@@ -93,7 +93,7 @@ public class UserController {
 
     @DeleteMapping("/user/delete")
     @ApiOperation(value = "Delete user by id")
-    @RequiresRoles(value = UserRoleCode.ADMIN)
+    @RequiresRoles(value = UserRoleCode.TENANT_ADMIN)
     public Response<Boolean> delete(@RequestParam("id") Integer id) {
         String currentUser = LoginUserUtils.getLoginUser().getName();
         return Response.success(userService.delete(id, currentUser));
diff --git 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/WorkflowApproverController.java
 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/WorkflowApproverController.java
index 29793917a..aa2fee23f 100644
--- 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/WorkflowApproverController.java
+++ 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/WorkflowApproverController.java
@@ -18,7 +18,7 @@
 package org.apache.inlong.manager.web.controller;
 
 import org.apache.inlong.manager.common.enums.OperationType;
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.pojo.common.PageResult;
 import org.apache.inlong.manager.pojo.common.Response;
 import org.apache.inlong.manager.pojo.user.UserRoleCode;
@@ -56,7 +56,7 @@ public class WorkflowApproverController {
     @PostMapping("/workflow/approver/save")
     @OperationLog(operation = OperationType.CREATE)
     @ApiOperation(value = "Save approver info")
-    @RequiresRoles(value = UserRoleCode.ADMIN)
+    @RequiresRoles(value = UserRoleCode.TENANT_ADMIN)
     public Response<Integer> save(@RequestBody ApproverRequest config) {
         return Response.success(workflowApproverService.save(config, 
LoginUserUtils.getLoginUser().getName()));
     }
@@ -72,14 +72,15 @@ public class WorkflowApproverController {
     @ApiOperation(value = "List workflow approvers")
     public Response<PageResult<ApproverResponse>> 
listByCondition(ApproverPageRequest request) {
         request.setCurrentUser(LoginUserUtils.getLoginUser().getName());
-        
request.setIsAdminRole(LoginUserUtils.getLoginUser().getRoles().contains(UserTypeEnum.ADMIN.name()));
+        request.setIsAdminRole(
+                
LoginUserUtils.getLoginUser().getRoles().contains(TenantUserTypeEnum.TENANT_ADMIN.name()));
         return 
Response.success(workflowApproverService.listByCondition(request));
     }
 
     @PostMapping("/workflow/approver/update")
     @OperationLog(operation = OperationType.UPDATE)
     @ApiOperation(value = "Update approver info")
-    @RequiresRoles(value = UserRoleCode.ADMIN)
+    @RequiresRoles(value = UserRoleCode.TENANT_ADMIN)
     public Response<Integer> update(@RequestBody ApproverRequest request) {
         return Response.success(workflowApproverService.update(request, 
LoginUserUtils.getLoginUser().getName()));
     }
@@ -88,7 +89,7 @@ public class WorkflowApproverController {
     @OperationLog(operation = OperationType.DELETE)
     @ApiOperation(value = "Delete approver by ID")
     @ApiImplicitParam(name = "id", value = "Workflow approver ID", 
dataTypeClass = Integer.class, required = true)
-    @RequiresRoles(value = UserRoleCode.ADMIN)
+    @RequiresRoles(value = UserRoleCode.TENANT_ADMIN)
     public Response<Boolean> delete(@PathVariable Integer id) {
         workflowApproverService.delete(id, 
LoginUserUtils.getLoginUser().getName());
         return Response.success(true);
diff --git 
a/inlong-manager/manager-web/src/test/java/org/apache/inlong/manager/web/controller/AnnoControllerTest.java
 
b/inlong-manager/manager-web/src/test/java/org/apache/inlong/manager/web/controller/AnnoControllerTest.java
index efbd4abae..e6655affe 100644
--- 
a/inlong-manager/manager-web/src/test/java/org/apache/inlong/manager/web/controller/AnnoControllerTest.java
+++ 
b/inlong-manager/manager-web/src/test/java/org/apache/inlong/manager/web/controller/AnnoControllerTest.java
@@ -17,7 +17,7 @@
 
 package org.apache.inlong.manager.web.controller;
 
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.util.JsonUtils;
 import org.apache.inlong.manager.pojo.common.Response;
 import org.apache.inlong.manager.pojo.user.UserLoginRequest;
@@ -144,7 +144,7 @@ class AnnoControllerTest extends WebBaseTest {
         UserRequest userInfo = UserRequest.builder()
                 .name("test_name")
                 .password(TEST_PWD)
-                .accountType(UserTypeEnum.ADMIN.getCode())
+                .accountType(TenantUserTypeEnum.TENANT_ADMIN.getCode())
                 .validDays(88888)
                 .build();
 
@@ -166,7 +166,7 @@ class AnnoControllerTest extends WebBaseTest {
                 // Username already exists in the init sql
                 .name("admin")
                 .password(TEST_PWD)
-                .accountType(UserTypeEnum.ADMIN.getCode())
+                .accountType(TenantUserTypeEnum.TENANT_ADMIN.getCode())
                 .validDays(88888)
                 .build();
 
diff --git 
a/inlong-manager/manager-workflow/src/main/java/org/apache/inlong/manager/workflow/core/impl/ProcessServiceImpl.java
 
b/inlong-manager/manager-workflow/src/main/java/org/apache/inlong/manager/workflow/core/impl/ProcessServiceImpl.java
index fe5f712fc..699cff3ec 100644
--- 
a/inlong-manager/manager-workflow/src/main/java/org/apache/inlong/manager/workflow/core/impl/ProcessServiceImpl.java
+++ 
b/inlong-manager/manager-workflow/src/main/java/org/apache/inlong/manager/workflow/core/impl/ProcessServiceImpl.java
@@ -21,7 +21,7 @@ import 
org.apache.inlong.manager.common.consts.InlongConstants;
 import org.apache.inlong.manager.common.enums.ErrorCodeEnum;
 import org.apache.inlong.manager.common.enums.ProcessStatus;
 import org.apache.inlong.manager.common.enums.TaskStatus;
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
+import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.util.Preconditions;
 import org.apache.inlong.manager.dao.entity.InlongGroupEntity;
 import org.apache.inlong.manager.dao.entity.UserEntity;
@@ -132,7 +132,8 @@ public class ProcessServiceImpl implements ProcessService {
         InlongGroupEntity groupEntity = groupMapper.selectByGroupId(groupId);
         UserEntity userEntity = userMapper.selectByName(user);
         boolean isInCharge = Preconditions.inSeparatedString(user, 
groupEntity.getInCharges(), InlongConstants.COMMA);
-        Preconditions.expectTrue(isInCharge || 
UserTypeEnum.ADMIN.getCode().equals(userEntity.getAccountType()),
+        Preconditions.expectTrue(
+                isInCharge || 
TenantUserTypeEnum.TENANT_ADMIN.getCode().equals(userEntity.getAccountType()),
                 errMsg);
     }
 

Reply via email to