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

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new 54b3000de51 [fix](auth)create view check select_priv of table instead 
of column (#49268)
54b3000de51 is described below

commit 54b3000de513b4be95e90ff776a2a6f44960b3cc
Author: zhangdong <zhangd...@selectdb.com>
AuthorDate: Thu Mar 20 23:08:58 2025 +0800

    [fix](auth)create view check select_priv of table instead of column (#49268)
---
 .../org/apache/doris/analysis/AlterViewStmt.java   |  2 +-
 .../org/apache/doris/analysis/BaseViewStmt.java    | 32 ++++------------
 .../org/apache/doris/analysis/CreateViewStmt.java  |  2 +-
 .../suites/auth_call/test_ddl_view_auth.groovy     | 44 ++++++++--------------
 .../suites/auth_p0/test_alter_view_auth.groovy     |  2 +-
 .../suites/auth_p0/test_create_view_auth.groovy    |  2 +-
 6 files changed, 28 insertions(+), 56 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterViewStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterViewStmt.java
index 39ea2ff1294..73570515e37 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterViewStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterViewStmt.java
@@ -74,7 +74,7 @@ public class AlterViewStmt extends BaseViewStmt {
         viewDefStmt.setNeedToSql(true);
         Analyzer viewAnalyzer = new Analyzer(analyzer);
         viewDefStmt.analyze(viewAnalyzer);
-        checkQueryAuth();
+        checkQueryAuth(viewAnalyzer);
         createColumnAndViewDefs(analyzer);
     }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/BaseViewStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/BaseViewStmt.java
index d33c234af11..77b4bc563d4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/BaseViewStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/BaseViewStmt.java
@@ -18,7 +18,7 @@
 package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.Column;
-import org.apache.doris.catalog.Env;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.DdlException;
@@ -27,19 +27,18 @@ import org.apache.doris.common.ErrorReport;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.util.SqlParserUtils;
 import org.apache.doris.common.util.ToSqlContext;
-import org.apache.doris.datasource.InternalCatalog;
-import org.apache.doris.mysql.privilege.PrivPredicate;
 import org.apache.doris.qe.ConnectContext;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
 import java.io.StringReader;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -92,26 +91,11 @@ public class BaseViewStmt extends DdlStmt {
         return inlineViewDef;
     }
 
-    protected void checkQueryAuth() throws UserException {
-        for (int i = 0; i < viewDefStmt.getBaseTblResultExprs().size(); ++i) {
-            Expr expr = viewDefStmt.getBaseTblResultExprs().get(i);
-            if (!(expr instanceof SlotRef)) {
-                continue;
-            }
-            SlotRef slotRef = (SlotRef) expr;
-            TableName queryTableName = slotRef.getTableName();
-            if (queryTableName == null) {
-                continue;
-            }
-            String queryColumnName = slotRef.getColumnName();
-            String ctlName = StringUtils.isEmpty(queryTableName.getCtl()) ? 
InternalCatalog.INTERNAL_CATALOG_NAME
-                    : queryTableName.getCtl();
-            // check privilege
-            Env.getCurrentEnv().getAccessManager()
-                    
.checkColumnsPriv(ConnectContext.get().getCurrentUserIdentity(), ctlName,
-                            queryTableName.getDb(), queryTableName.getTbl(), 
Sets.newHashSet(queryColumnName),
-                            PrivPredicate.SELECT);
-        }
+    protected void checkQueryAuth(Analyzer analyzer) throws UserException {
+        Map<Long, TableIf> tableMap = Maps.newTreeMap();
+        Set<String> parentViewNameSet = Sets.newHashSet();
+        // not really want to obtain tables, but rather use the authentication 
logic in this method
+        viewDefStmt.getTables(analyzer, false, tableMap, parentViewNameSet);
     }
 
     /**
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateViewStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateViewStmt.java
index 50b658a48aa..512818309a2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateViewStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateViewStmt.java
@@ -96,7 +96,7 @@ public class CreateViewStmt extends BaseViewStmt {
             Analyzer viewAnalyzer = new Analyzer(analyzer);
             viewDefStmt.forbiddenMVRewrite();
             viewDefStmt.analyze(viewAnalyzer);
-            checkQueryAuth();
+            checkQueryAuth(viewAnalyzer);
             createColumnAndViewDefs(viewAnalyzer);
         } finally {
             // must reset this flag, otherwise, all following query statement 
in this connection
diff --git a/regression-test/suites/auth_call/test_ddl_view_auth.groovy 
b/regression-test/suites/auth_call/test_ddl_view_auth.groovy
index 46930c7e3de..f90bab9dc8e 100644
--- a/regression-test/suites/auth_call/test_ddl_view_auth.groovy
+++ b/regression-test/suites/auth_call/test_ddl_view_auth.groovy
@@ -66,24 +66,22 @@ suite("test_ddl_view_auth","p0,auth_call") {
             exception 'denied'
         }
     }
-    sql """grant select_priv(id) on ${dbName}.${tableName} to ${user}"""
-    connect(user=user, password="${pwd}", url=context.config.jdbcUrl) {
-        test {
-            sql """CREATE VIEW ${dbName}.${viewName} (k1, v1)
-                AS
-                SELECT id as k1, SUM(id) FROM ${dbName}.${tableName}
-                WHERE id = 1 GROUP BY k1;"""
-            exception 'denied'
-        }
-        def res = sql """SHOW VIEW from ${tableName} from ${dbName}"""
-        assertTrue(res.size() == 0)
-    }
-    sql """CREATE VIEW ${dbName}.${viewName} (k1, v1)
-            AS
-            SELECT id as k1, SUM(id) FROM ${dbName}.${tableName}
-            WHERE id = 1 GROUP BY k1;"""
-    sql """grant Create_priv on ${dbName}.${viewName} to ${user}"""
-    sql """drop view ${dbName}.${viewName}"""
+     sql """grant Create_priv on ${dbName}.${viewName} to ${user}"""
+     connect(user=user, password="${pwd}", url=context.config.jdbcUrl) {
+             test {
+                 sql """CREATE VIEW ${dbName}.${viewName} (k1, v1)
+                     AS
+                     SELECT id as k1, SUM(id) FROM ${dbName}.${tableName}
+                     WHERE id = 1 GROUP BY k1;"""
+                 exception "denied"
+             }
+             test {
+                 sql """SHOW VIEW from ${tableName} from ${dbName}"""
+                 exception 'denied'
+             }
+         }
+    sql """grant select_priv on ${dbName}.${tableName} to ${user}"""
+
     connect(user=user, password="${pwd}", url=context.config.jdbcUrl) {
         sql """CREATE VIEW ${dbName}.${viewName} (k1, v1)
             AS
@@ -93,16 +91,6 @@ suite("test_ddl_view_auth","p0,auth_call") {
         def res = sql """SHOW VIEW from ${tableName} from ${dbName}"""
         assertTrue(res.size() == 1)
     }
-    connect(user=user, password="${pwd}", url=context.config.jdbcUrl) {
-        sql """set enable_fallback_to_original_planner=false;"""
-        test {
-            sql """CREATE VIEW ${dbName}.${viewName} (k1, v1)
-                AS
-                SELECT username as k1, SUM(id) FROM ${dbName}.${tableName}
-                WHERE id = 1 GROUP BY k1;"""
-            exception 'denied'
-        }
-    }
 
     // ddl alter
     // user alter
diff --git a/regression-test/suites/auth_p0/test_alter_view_auth.groovy 
b/regression-test/suites/auth_p0/test_alter_view_auth.groovy
index 137af46f32f..2d8c99e95ae 100644
--- a/regression-test/suites/auth_p0/test_alter_view_auth.groovy
+++ b/regression-test/suites/auth_p0/test_alter_view_auth.groovy
@@ -56,7 +56,7 @@ suite("test_alter_view_auth","p0,auth") {
             sql "alter view ${dbName}.${viewName} as select * from 
${dbName}.${tableName};"
         } catch (Exception e) {
             log.info(e.getMessage())
-            assertTrue(e.getMessage().contains("Admin_priv,Select_priv"))
+            assertTrue(e.getMessage().contains("denied"))
         }
     }
     try_sql """drop table if exists ${dbName}.${tableName}"""
diff --git a/regression-test/suites/auth_p0/test_create_view_auth.groovy 
b/regression-test/suites/auth_p0/test_create_view_auth.groovy
index 7e2e253123c..54f32ebd1fd 100644
--- a/regression-test/suites/auth_p0/test_create_view_auth.groovy
+++ b/regression-test/suites/auth_p0/test_create_view_auth.groovy
@@ -53,7 +53,7 @@ suite("test_create_view_auth","p0,auth") {
             sql "create view ${dbName}.v1 as select * from 
${dbName}.${tableName};"
         } catch (Exception e) {
             log.info(e.getMessage())
-            assertTrue(e.getMessage().contains("Admin_priv,Select_priv"))
+            assertTrue(e.getMessage().contains("denied"))
         }
     }
     sql """drop table if exists ${dbName}.${tableName}"""


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to