PostgreSQL:浅析 ACL 权限

在 PostgreSQL 维护过程中,表,视图的权限查看是很平常的工作,本文从一张视图的权限开始,简单的介绍权限查看的几种方法。

一张视图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[pg93@redhatB ~]$ psql francs francs
psql (9.3beta1)
Type "help" for help.

francs=> /d+ view1_test
View "francs.view1_test"
Column | Type | Modifiers | Storage | Description
--------+-----------------------+-----------+----------+-------------
id | integer | | plain |
name | character varying(64) | | extended |
View definition:
SELECT test_view1.id,
test_view1.name
FROM test_view1;

备注:假设系统有如上视图,如何查看这张视图的权限呢?大概有以下几种方法:

方法一: 通过 /dp 元子命令

1
2
3
4
5
6
7
francs=> /dp view1_test
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+------------+------+-----------------------+--------------------------
francs | view1_test | view | francs=arwdDxt/francs+|
| | | select_only=rw/francs |
(1 row)

备注:/dp 后接表名或视图名查看对像权限,个人推荐这种方法,因为简单,但要会看输出的格式。例如,什么是 “arwd…?” , 详见附一: ACL 权限列表。

方法二: 通过 aclexplode 函数

2.1 查看 acl

1
2
3
4
5
francs=> select oid,relname ,relacl from pg_class where relname='view1_test';
oid | relname | relacl
-------+------------+-----------------------------------------------
16492 | view1_test | {francs=arwdDxt/francs,select_only=rw/francs}
(1 row)

备注: pg_class.relacl 输出实际上和 dp 显示的值类似。

2.2 解析 acl 权限

1
2
3
4
5
6
7
8
9
10
11
12
13
francs=> select * From aclexplode('{francs=arwdDxt/francs,select_only=rw/francs}');
grantor | grantee | privilege_type | is_grantable
---------+---------+----------------+--------------
16384 | 16384 | INSERT | f
16384 | 16384 | SELECT | f
16384 | 16384 | UPDATE | f
16384 | 16384 | DELETE | f
16384 | 16384 | TRUNCATE | f
16384 | 16384 | REFERENCES | f
16384 | 16384 | TRIGGER | f
16384 | 16496 | SELECT | f
16384 | 16496 | UPDATE | f
(9 rows)

备注:aclexplode 函数将 acl 转换成易读的格式。

2.3 找到对应用户

1
2
3
4
5
6
francs=> select oid,rolname from pg_roles where oid in (16384,16496);
oid | rolname
-------+-------------
16384 | francs
16496 | select_only
(2 rows)

方法三: 通过 table_privileges 视图

3.1 查看 information_schema.table_privileges

1
2
3
4
5
6
7
8
9
10
11
12
13
14
francs=> select grantor,grantee,table_schema,table_name,privilege_type from information_schema.table_privileges
francs-> where table_name='view1_test';
grantor | grantee | table_schema | table_name | privilege_type
---------+-------------+--------------+------------+----------------
francs | francs | francs | view1_test | INSERT
francs | francs | francs | view1_test | SELECT
francs | francs | francs | view1_test | UPDATE
francs | francs | francs | view1_test | DELETE
francs | francs | francs | view1_test | TRUNCATE
francs | francs | francs | view1_test | REFERENCES
francs | francs | francs | view1_test | TRIGGER
francs | select_only | francs | view1_test | SELECT
francs | select_only | francs | view1_test | UPDATE
(9 rows)

备注:上面格式简单多了,用户 select_only 对视图 view1_test 只有 SELECT,UPDATE 权限。

附: ACL 权限列表

Relacl Code Privilege Name
a INSERT
r SELECT
w UPDATE
d DELETE
D TRUNCATE
x REFERENCES
t TRIGGER
arwdDxt ALL

备注:建议牢记以上权限代码,才能完全看懂 dp 输出。

参考

原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/237978.html

(0)
上一篇 2022年1月29日
下一篇 2022年1月29日

相关推荐

发表回复

登录后才能评论