Skip to content

Commit 2facc0b

Browse files
zhangrenhuayaooqinn
authored andcommitted
[KYUUBI #2650] Add FilteredShowColumnsCommand to AuthZ module
### _Why are the changes needed?_ ### _How was this patch tested?_ - [ ] Add some test cases that check the changes thoroughly including negative and positive cases if possible - [ ] Add screenshots for manual tests if appropriate - [ ] [Run test](https://kyuubi.apache.org/docs/latest/develop_tools/testing.html#running-tests) locally before make a pull request Closes #2650 from zhangrenhua/feature/AddFilteredShowColumnsCommand. Closes #2650 842a00e [zhangrenhua] Add FilteredShowColumnsCommand to AuthZ module Authored-by: zhangrenhua <zhangrenhuaman@senses-ai.com> Signed-off-by: Kent Yao <yao@apache.org>
1 parent f16ac8b commit 2facc0b

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

extensions/spark/kyuubi-spark-authz/src/main/scala/org/apache/kyuubi/plugin/spark/authz/ranger/RuleReplaceShowObjectCommands.scala

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import org.apache.spark.sql.{Row, SparkSession}
2222
import org.apache.spark.sql.catalyst.expressions.Attribute
2323
import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan
2424
import org.apache.spark.sql.catalyst.rules.Rule
25-
import org.apache.spark.sql.execution.command.RunnableCommand
25+
import org.apache.spark.sql.execution.command.{RunnableCommand, ShowColumnsCommand}
2626

2727
import org.apache.kyuubi.plugin.spark.authz.{ObjectType, OperationType}
2828
import org.apache.kyuubi.plugin.spark.authz.util.{AuthZUtils, ObjectFilterPlaceHolder, WithInternalChild}
@@ -37,6 +37,8 @@ class RuleReplaceShowObjectCommands extends Rule[LogicalPlan] {
3737
ObjectFilterPlaceHolder(n)
3838
case r: RunnableCommand if r.nodeName == "ShowFunctionsCommand" =>
3939
FilteredShowFunctionsCommand(r)
40+
case r: RunnableCommand if r.nodeName == "ShowColumnsCommand" =>
41+
FilteredShowColumnsCommand(r)
4042
case _ => plan
4143
}
4244
}
@@ -101,3 +103,24 @@ case class FilteredShowFunctionsCommand(delegated: RunnableCommand)
101103
result != null && result.getIsAllowed
102104
}
103105
}
106+
107+
case class FilteredShowColumnsCommand(delegated: RunnableCommand)
108+
extends FilteredShowObjectCommand(delegated) with WithInternalChild {
109+
110+
override val output: Seq[Attribute] = delegated.output
111+
112+
override def run(spark: SparkSession): Seq[Row] = {
113+
val rows = delegated.run(spark)
114+
val table = delegated.asInstanceOf[ShowColumnsCommand].tableName
115+
val ugi = AuthZUtils.getAuthzUgi(spark.sparkContext)
116+
rows.filter(f =>
117+
isAllowed(Row(table.database.orNull, table.table, f.getString(0)), ugi))
118+
}
119+
120+
override protected def isAllowed(r: Row, ugi: UserGroupInformation): Boolean = {
121+
val resource = AccessResource(ObjectType.COLUMN, r.getString(0), r.getString(1), r.getString(2))
122+
val request = AccessRequest(resource, ugi, OperationType.SHOWCOLUMNS, AccessType.USE)
123+
val result = SparkRangerAdminPlugin.isAccessAllowed(request)
124+
result != null && result.getIsAllowed
125+
}
126+
}

extensions/spark/kyuubi-spark-authz/src/test/scala/org/apache/kyuubi/plugin/spark/authz/ranger/RangerSparkExtensionSuite.scala

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,26 @@ abstract class RangerSparkExtensionSuite extends KyuubiFunSuite with SparkSessio
316316
doAs("admin", sql(s"DROP DATABASE IF EXISTS $db3"))
317317
}
318318
}
319+
320+
test("show columns") {
321+
val db = "default"
322+
val table = "src"
323+
val col = "key"
324+
val create = s"CREATE TABLE IF NOT EXISTS $db.$table ($col int, value int) USING $format"
325+
try {
326+
doAs("admin", sql(create))
327+
328+
doAs("admin", assert(sql(s"SHOW COLUMNS IN $table").count() == 2))
329+
doAs("admin", assert(sql(s"SHOW COLUMNS IN $db.$table").count() == 2))
330+
doAs("admin", assert(sql(s"SHOW COLUMNS IN $table IN $db").count() == 2))
331+
332+
doAs("kent", assert(sql(s"SHOW COLUMNS IN $table").count() == 1))
333+
doAs("kent", assert(sql(s"SHOW COLUMNS IN $db.$table").count() == 1))
334+
doAs("kent", assert(sql(s"SHOW COLUMNS IN $table IN $db").count() == 1))
335+
} finally {
336+
doAs("admin", sql(s"DROP TABLE IF EXISTS $db.$table"))
337+
}
338+
}
319339
}
320340

321341
class InMemoryCatalogRangerSparkExtensionSuite extends RangerSparkExtensionSuite {

0 commit comments

Comments
 (0)