GaussDB(DWS)如何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的权限:
- 连接GaussDB(DWS)集群的数据库gaussdb。
1 2
gsql -d gaussdb -p 8000 -h 192.168.x.xx -U dbadmin -W password -r gaussdb=>
- 创建用户u1。
1
gaussdb=> CREATE USER u1 IDENTIFIED BY 'xxxxxxxx';
- 确认用户u1可正常访问数据库gaussdb。
1 2
gsql -d gaussdb -p 8000 -h 192.168.x.xx -U u1 -W password -r gaussdb=>
- 使用管理员用户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
- 验证结果,使用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.