ClickHouse 仅授予用户对数据库中几个表的访问权限
Posted
技术标签:
【中文标题】ClickHouse 仅授予用户对数据库中几个表的访问权限【英文标题】:ClickHouse give user Access Rights only for several tables in database 【发布时间】:2019-09-16 08:30:51 【问题描述】:我在 Clickhouse 中有两个数据库:
测试 测试2此数据库中由查询创建的表:
CREATE TABLE test.Migrations3 ( date Date DEFAULT toDate(now()), id UInt8, time UInt64) ENGINE = ReplicatedMergeTree('/clickhouse/tables/shard/test/Migrations3', 'clickhouse1', date, (id, time), 8192);
我为这些数据库创建了两个用户。 用户权限如下:
<user>
<password>pass</password>
<networks incl="networks" replace="replace">
<ip>::/0</ip>
<ip>127.0.0.1</ip>
</networks>
<!-- Settings profile for user. -->
<profile>default</profile>
<!-- Quota for user. -->
<quota>default</quota>
</user>
我在这些表中得到了一些数据,它们是这样插入的:
INSERT INTO test.Migrations3 (date) VALUES (689);
现在我想创建可以访问数据库测试的新只读用户,但仅适用于该数据库中的表 Migrations3,而不适用于数据库中的所有表。 我阅读了文档,但找不到如何设置此访问权限。
现在我尝试使用这些权限:
<user1>
<databases>
<test>
<Migrations3>
<filter>id = 1</filter>
</Migrations3>
</test>
</databases>
<password>pass</password>
<networks incl="networks" replace="replace">
<ip>::/0</ip>
<ip>127.0.0.1</ip>
</networks>
<!-- Settings profile for user. -->
<profile>readonly</profile>
<!-- Quota for user. -->
<quota>default</quota>
<allow_databases>
<database>test</database>
</allow_databases>
</user1>
当我运行 select * from test.Migrations3
时,我看到了所有行,但我已经在权限中设置了过滤器,只显示 id -eq 1
我做错了什么?
【问题讨论】:
请阅读本文并提高您的问题质量:***.com/help/mcve 【参考方案1】:抱歉,目前您可以设置对整个数据库的访问权限 https://clickhouse.yandex/docs/en/operations/access_rights/ 但是您可以通过行级安全性限制对表的访问 如此处所述https://clickhouse.yandex/docs/en/operations/settings/settings_users/#user-name-databases
<user1>
<databases>
<database_name>
<!-- filter all rows from table -->
<table1>
<filter>1 = 0</filter>
</table1>
</database_name>
</databases>
</user1>
【讨论】:
当我运行select * from test.Migrations3
时,我看到了所有行,但我已经在权限中设置了过滤器,只显示 id -eq 1 我添加我的权限来质疑我做错了什么?
您确定从 user1 运行查询吗?你能跑SELECT currentUser()
吗?
是的,我确定。我无法连接到另一个数据库,但我会选择数据库中我获得权限的所有内容【参考方案2】:
以下配置强制用户user1通过SELECT查询只能看到table1的行,其中id字段的值为1000。
<user1>
<databases>
<database_name>
<table1>
<filter>id = 1000</filter>
</table1>
</database_name>
</databases>
</user1>
过滤器可以是任何产生 UInt8 类型值的表达式。它通常包含比较和逻辑运算符。不为此用户返回从 database_name.table1 中筛选结果为 0 的行。过滤与 PREWHERE 操作不兼容,禁用 WHERE→PREWHERE 优化。
【讨论】:
请在您的答案中添加解释性文字。在此处了解更多信息***.com/help/how-to-answer 所提供的答案被标记为低质量帖子以供审核。以下是How do I write a good answer? 的一些指南。提供的这个答案可能是正确的,但它可以从解释中受益。仅代码答案不被视为“好”答案。来自review。 当我运行select * from test.Migrations3
时,我看到了所有行,但我已经在权限中设置了过滤器,只显示 id -eq 1 我添加我的权限来质疑我做错了什么?
你用的是什么版本的clickhouse?请运行SELECT version()
?
版本:18.12.17以上是关于ClickHouse 仅授予用户对数据库中几个表的访问权限的主要内容,如果未能解决你的问题,请参考以下文章