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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]