[fix](auth)Fix the need for low-level table permissions when querying… (#44842)

… views in certain situations (#44621)

pick: https://github.com/apache/doris/pull/44621
This commit is contained in:
zhangdong
2024-12-04 18:01:28 +08:00
committed by GitHub
parent 6714936f8b
commit 385cd1fcdb
3 changed files with 104 additions and 1 deletions

View File

@ -171,6 +171,8 @@ public class StatementContext implements Closeable {
private final Map<MvccTableInfo, MvccSnapshot> snapshots = Maps.newHashMap();
private boolean privChecked;
public StatementContext() {
this(ConnectContext.get(), null, 0);
}
@ -578,4 +580,12 @@ public class StatementContext implements Closeable {
this.tableIdMapping.put(tableIdentifier, tableId);
return tableId;
}
public boolean isPrivChecked() {
return privChecked;
}
public void setPrivChecked(boolean privChecked) {
this.privChecked = privChecked;
}
}

View File

@ -49,9 +49,13 @@ public class CheckPrivileges extends ColumnPruning {
@Override
public Plan rewriteRoot(Plan plan, JobContext jobContext) {
// Only enter once, if repeated, the permissions of the table in the view will be checked
if (jobContext.getCascadesContext().getStatementContext().isPrivChecked()) {
return plan;
}
this.jobContext = jobContext;
super.rewriteRoot(plan, jobContext);
jobContext.getCascadesContext().getStatementContext().setPrivChecked(true);
// don't rewrite plan
return plan;
}

View File

@ -0,0 +1,89 @@
// 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.
suite("test_select_view_auth","p0,auth") {
String suiteName = "test_select_view_auth"
String user = "${suiteName}_user"
String pwd = 'C123_567p'
String dbName = "${suiteName}_db"
String tableName1 = "${suiteName}_table1"
String tableName2 = "${suiteName}_table2"
String viewName = "${suiteName}_view"
try_sql("drop user ${user}")
try_sql """drop table if exists ${dbName}.${tableName1}"""
try_sql """drop table if exists ${dbName}.${tableName2}"""
try_sql """drop view if exists ${dbName}.${viewName}"""
sql """drop database if exists ${dbName}"""
sql """create user '${user}' IDENTIFIED by '${pwd}'"""
//cloud-mode
if (isCloudMode()) {
def clusters = sql " SHOW CLUSTERS; "
assertTrue(!clusters.isEmpty())
def validCluster = clusters[0][0]
sql """GRANT USAGE_PRIV ON CLUSTER ${validCluster} TO ${user}""";
}
sql """create database ${dbName}"""
sql("""use ${dbName}""")
sql """
CREATE TABLE IF NOT EXISTS ${dbName}.`${tableName1}` (
id BIGINT,
username VARCHAR(20)
)
DISTRIBUTED BY HASH(id) BUCKETS 2
PROPERTIES (
"replication_num" = "1"
);
"""
sql """
CREATE TABLE IF NOT EXISTS ${dbName}.`${tableName2}` (
id BIGINT,
username VARCHAR(20)
)
DISTRIBUTED BY HASH(id) BUCKETS 2
PROPERTIES (
"replication_num" = "1"
);
"""
sql """create view ${dbName}.${viewName} as select * from ${dbName}.${tableName1} union select * from ${dbName}.${tableName2};"""
sql """grant select_priv on regression_test to ${user}"""
// table column
connect(user=user, password="${pwd}", url=context.config.jdbcUrl) {
try {
sql "select * from ${dbName}.${viewName}"
} catch (Exception e) {
log.info(e.getMessage())
assertTrue(e.getMessage().contains("denied"))
}
}
sql """grant select_priv on ${dbName}.${viewName} to ${user}"""
connect(user=user, password="${pwd}", url=context.config.jdbcUrl) {
sql "select * from ${dbName}.${viewName}"
}
try_sql("drop user ${user}")
try_sql """drop table if exists ${dbName}.${tableName1}"""
try_sql """drop table if exists ${dbName}.${tableName2}"""
try_sql """drop view if exists ${dbName}.${viewName}"""
sql """drop database if exists ${dbName}"""
}