更新时间:2024-06-11 GMT+08:00

如何REVOKE某用户的connect on database权限?

业务场景

某业务中需要撤销指定用户u1连接某数据库的权限,在执行REVOKE CONNECT ON DATABASE gaussdb FROM u1;命令成功后,使用u1还能继续连接数据库,撤销权限没有生效。

原因分析

若直接使用REVOKE CONNECT ON DATABASE gaussdb from u1命令撤销u1用户的权限不会生效,因为数据库的CONNECT权限授予了PUBLIC,需指定关键字PUBLIC实现。

  • GaussDB(DWS)提供了一个隐式定义的拥有所有角色的组PUBLIC,所有创建的用户和角色默认拥有PUBLIC所拥有的权限。要撤销或重新授予用户和角色对PUBLIC的权限,可通过在GRANT和REVOKE指定关键字PUBLIC实现。
  • GaussDB(DWS)会将某些类型的对象上的权限授予PUBLIC。默认情况下,对表、表字段、序列、外部数据源、外部服务器、模式或表空间对象的权限不会授予PUBLIC。以下这些对象的权限会授予PUBLIC:
    • 数据库的CONNECT权限。
    • CREATE TEMP TABLE权限。
    • 函数的EXECUTE特权。
    • 语言和数据类型(包括域)的USAGE特权。
  • 对象拥有者可以撤销默认授予PUBLIC的权限并专门授予权限给其他用户。

操作示例

撤销用户u1访问数据库gaussdb的权限:

  1. 连接GaussDB(DWS)集群的数据库gaussdb。

    1
    2
    gsql -d gaussdb -p 8000 -h 192.168.x.xx -U dbadmin -W password -r
    gaussdb=>
    

  2. 创建用户u1。

    1
    gaussdb=> CREATE USER u1 IDENTIFIED BY 'xxxxxxxx';
    

  3. 确认用户u1可正常访问数据库gaussdb。

    1
    2
    gsql -d gaussdb -p 8000 -h 192.168.x.xx -U u1 -W password -r
    gaussdb=>
    

  4. 使用管理员用户dbadmin连接数据库gaussdb,执行REVOKE命令撤销public的connect on database权限。

    1
    gsql -d gaussdb -h 192.168.x.xx -U dbadmin -p 8000 -r
    
    1
    2
    gaussdb=> REVOKE CONNECT ON DATABASE gaussdb FROM public;
    REVOKE
    

  5. 验证结果,使用u1连接数据库,显示如下信息表示用户u1的connect on database权限已成功撤销。

    1
    2
    3
    gsql -d gaussdb -p 8000 -h 192.168.x.xx -U u1 -W password -r
    gsql: FATAL:  permission denied for database "gaussdb"
    DETAIL:  User does not have CONNECT privilege.