POSTGRESQL 如何用系统函数来诊断权限问题

news/2024/7/9 21:53:34 标签: postgresql, 数据库

3fb93c4c1a0334c5a6f8aeb39b01b06d.png

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共1200人左右 1 + 2 + 3)新人会进入3群

开发人员很少关注于数据库系统的权限,而POSTGRESQL 相对于MYSQL来说,他的权限是复杂的,尤其在一些规范的企业,对于权限的要求很高,而随时掌握账号对于数据库OBJECTS的权限的状态,在很多项目中是乙方需要知道该怎么做的。

我们从上到下,一一给大家进行演示,你的用户组需要针对PG中不同的数据库掌握权限,那么那些账号有那些数据库的权限需要进行一个判断。

我们创建一个账号,关于这个账号在什么权限都没有,从下面的函数可以判断,什么都没有的权限的账号可以创建临时表,如果减少用户的名的传参,则为当前的账号是否有对于数据库权限的验证。

d1557ba361f9e7788097ef8b370f1b39.png

25b38e594a4fa5ff3adbb046bfa9741e.png

postgres=# select has_database_privilege('test','postgres','temp');
 has_database_privilege 
------------------------
 t
(1 row)


postgres=# 
postgres=# select has_database_privilege('test','postgres','temporary');
 has_database_privilege 
------------------------
 t
(1 row)


postgres=# 
postgres=# select has_database_privilege('test','postgres','create');
 has_database_privilege 
------------------------
 f
(1 row)

这里我们继续针对POSTGRESQL 中的某个SCHEMA 进行判断, 一个具有OWNER test_schema的账号,具有创建和usageschema的权限

1b4fb59ef137f98048f59d521c008075.png

dvdrental=# 
dvdrental=# select has_schema_privilege('test','test_schema','create');
 has_schema_privilege 
----------------------
 t
(1 row)


dvdrental=# select has_schema_privilege('test','test_schema','usage');
 has_schema_privilege 
----------------------
 t
(1 row)

a

09c78a10f2f1f9228990bc2b6fdad85c.png

针对表的操作进行权限的判断

dvdrental=# 
dvdrental=# select has_table_privilege('test','TEST_TABLE','select');
 has_table_privilege 
---------------------
 f
(1 row)


ge('test','TEST_TABLdvdrental=# select has_table_privilege('test','TEST_TABLE','insert');
 has_table_privilege 
---------------------
 f
(1 row)


dvdrental=# select has_table_privilege('test','TEST_TABLE','update');
 has_table_privilege 
---------------------
 f
(1 row)


dvdrental=# select has_table_privilege('test','TEST_TABLE','delete');
 has_table_privilege 
---------------------
 f
(1 row)


dvdrental=# select has_table_privilege('test','TEST_TABLE','references');
 has_table_privilege 
---------------------
 f
(1 row)

73d72e98b5b832179423e384b2d77838.png

我们在创建了一个新的schema 并且在新的schema中创建的了表,但是test 用户对于这个数据库下的schema 是owner那么我们创建的这个表test用户是否有权限呢。

dvdrental=# select has_table_privilege('test','test_schema.TEST_TABLE','select');
 has_table_privilege 
---------------------
 f
(1 row)

我们可以看到,test账号对于test_schema 下的表 TEST_TABLE 是没有权限的,我们来验证一遍,通过 test 登陆到系统中,来访问这个表。

c634379dedc3d4f17e181d0522664492.png

a38d149a2cb25d2b2a9b6d3c639a3c34.png

在赋予权限后,我们再次通过验证的函数来进行判断,的确赋予权限了。

dvdrental=# select has_table_privilege('test','test_schema.TEST_TABLE','select');
 has_table_privilege 
---------------------
 t
(1 row)


dvdrental=# select has_table_privilege('test','test_schema.TEST_TABLE','update');
 has_table_privilege 
---------------------
 t
(1 row)


dvdrental=# select has_table_privilege('test','test_schema.TEST_TABLE','insert');
 has_table_privilege 
---------------------
 t
(1 row)


dvdrental=# select has_table_privilege('test','test_schema.TEST_TABLE','references');
 has_table_privilege 
---------------------
 f
(1 row)

那么如果针对表中的权限是需要判定多种的权限如何进行操作

38c3b6ca5a9c5bcb5478e37144e87aa9.png

select has_table_privilege('test','test_schema.TEST_TABLE','insert,select,update,update with grant option');

最后关于关于开发经常提到的关于函数和存储过程方面的权限问题,我们创建一个函数,一个存储过程。

cf25e6fa25163e746d94f66f0ec4967d.png

下面的我们通过has_function_privilege 函数来对test 用户进行执行此函数权限的确认,得到的结果是YES, test 账号对于这个函数是有相关的执行权限的。

fab553419bdf844192239ccdab3b00a4.png

同样的,我们创建一个存储过程,我们还是使用上面的函数来判断

522ca902575fcd42a6738bba5ba85181.png

SELECT has_function_privilege('test', 'public.insert_data(varchar)', 'execute');

bfb899a9c601806b42f7438585b818b7.png

同样使用判断函数权限的方式用在判断存储过程中也是一样的有效。

postgresql 的使用中,尤其乙方在服务甲方的情况下,很多初级的问题尤其权限都需要介入和解决,以及判断,那么自动化的方式来进行判断对于乙方是非常重要的。

下面的脚本,抛砖引玉,通过相关的函数,将schema下的表的权限进行全面的打印。

SELECT 
     tablename
     ,usename
     ,HAS_TABLE_PRIVILEGE(users.usename, tablename, 'select') AS sel
     ,HAS_TABLE_PRIVILEGE(users.usename, tablename, 'insert') AS ins
     ,HAS_TABLE_PRIVILEGE(users.usename, tablename, 'update') AS upd
     ,HAS_TABLE_PRIVILEGE(users.usename, tablename, 'delete') AS del
FROM
(SELECT * from pg_tables
WHERE schemaname = 'public') as tables
,(SELECT * FROM pg_user) AS users;

d66780c21498349a67a4a549565138a1.png

18eb0e6c540d64f04428df88538bbc1a.png


http://www.niftyadmin.cn/n/4962973.html

相关文章

移动端和PC端对比【组件库+调试vconsole +构建vite/webpack+可视化echarts/antv】

目录 组件库 移动端 vue vant PC端 react antd vue element 调试:vconsole vs dev tools中的控制台(Console) ​​​​​​​vconsole:在真机上调试 构建工具 webpack 原理 Babel:JS编译器(…

c++ day3

整理思维导图设计一个Per类,类中包含私有成员:姓名、年龄、指针成员身高、体重,再设计一个Stu类,类中包含私有成员:成绩、Per类对象 p1,设计这两个类的构造函数、析构函数和拷贝构造函数。

P5737 【深基7.例3】闰年展示

题目描述 输入 x , y x,y x,y,输出 [ x , y ] [x,y] [x,y] 区间中闰年个数,并在下一行输出所有闰年年份数字,使用空格隔开。 输入格式 输入两个正整数 x , y x,y x,y,以空格隔开。 输出格式 第一行输出一个正整数&#xf…

C++下的字符集转换/宽窄字符转换/UTF-GBK转换

前言 使用C做开发时,经常需要用到编码字符转换。比如,Windows下,为了多语言的支持,API调用一般都推荐采用宽字节API(即W后缀API),但是在使用类似tinyXML,JSON解析等三方库的时候&am…

为什么要写 python if __name__ == ‘__main__‘: 是什么意思,有什么作用

之前我也查过很多资料,想要弄清楚 if name ‘main’: 有什么作用,网上会告诉你当这个文件为当前执行文件时 name ‘main’,下面的代码会执行之类的,完全搞不懂!典型的中式为了解释而解释。下面将给你真正的解释&…

YZ系列工具:YZ08:窗体加载图片后进行放大查看

【分享成果,随喜正能量】修行,不是让你什么都顺,而是让你知道为什么不顺?心里执着的多,磨难就越多,越想得到什么,就会失去什么。修行,不是等待菩萨来救赎,而是需要自渡&a…

【Python】Python入门简介

Python是一种高级编程语言,因其易学易用、语法简洁明了而广受欢迎。如果你想入门Python编程,本文将为你提供一些必备的基础知识和建议。 首先,让我们了解一下Python的历史和背景。Python是由荷兰程序员Guido van Rossum于1991年创建的一种编…

CSS实现一个交互感不错的卡片列表

0、需求分析 横向滚动鼠标悬停时突出显示 默认堆叠展示鼠标悬停时,完整展示当前块适当旋出效果 移动端样式优化、磁吸效果美化滚动条 1、涉及的主要知识块 flex 布局css 简单变换过渡 transform、transition 渐变色函数 linear-gradient… 伪类、伪元素 滚动条、…