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 仅授予用户对数据库中几个表的访问权限的主要内容,如果未能解决你的问题,请参考以下文章

为除一个/几个表之外的所有表授予 [几乎] 所有 mySQL 权限

授予对 Postgres 中所有表的访问权限

限制对 Redshift 表的访问,仅授予对视图的访问权限

两个oracle数据库个有部分数据要同步给对方怎么办?

授予 MySQL 中各个字段的权限

仅对表中的一列授予更改