【Postgres实战】Postgres的角色权限本地/在线不一致?

背景

Gin-Vue-Admin是开源的全栈开发平台,可以担任企业内部后台管理的职责。官网地址是:gin-vue-admin | GVA 文档站。上图为在线demo展示页面。

它的后台使用Golang(The Go Programming Language (google.cn)),基于开源的Web框架Gin(Gin Web Framework (gin-gonic.com))。

它的前台使用渐进式JavaScript框架Vue(Introduction | Vue.js (vuejs.org))。

正文

使用Gin-Vue-Admin一段时间了,没有太多时间研究代码细节,因此,进行业务开发时遇到一个问题,觉得莫名其妙。这个问题就是制作了一个页面,本地开发出来,测试良好,可以正常读取数据库的数据并显示到页面上。但放到线上,就会告诉我没有权限查询数据。错误如下:

复制代码
ERROR: permission denied for table tbl_xxx (SQLSTATE 42501)

其中tbl_xxx是我数据库中的表。说明当前操作数据库的角色没有SELECT的权限。

我赶紧使用sql语句查询该表的权限

复制代码
SELECT
  grantor,
  grantee,
  privilege_type,
  table_schema,
  table_name
FROM
  information_schema.table_privileges
WHERE
  table_name = 'tbl_xxx';

发现本地和在线出奇地一致,该表没有被授予任何权限。

我就纳了一个闷,既然没有被授予权限,为何本地测试没问题呢?本地测试没问题,在线却又为何出了问题呢?难道本地和在线的数据库角色不一样?

我打开Gin-Vue-Admin的本地配置文件config.yaml,又打开了在线配置文件config.docker.yaml,发现两者的path、port、db-name不同外,数据库角色是一样的,都是ugc_online_r,如下图所示:

这只能说明一种情况,就是本地和在线数据库相同名字的角色,权限是不一致的。因此,我使用sql语句,分别查询本地和在线数据库的角色权限信息,如下:

复制代码
SELECT * FROM pg_roles;

得到如下结果:

上图为本地,下图为在线数据库的角色信息。这里只需要关注rolsuper这个列即可。

可以发现,本地rolsuper是true,而在线该值为false。

这个字段代表超级角色标记,也就是说,只要设置为true,那么该角色对数据库的所有CRUD都拥有权限。

好了,破案了。赶紧把权限授予tbl_xxx表吧。

复制代码
GRANT SELECT ON tbl_xxx TO ugc_online_r;

为了以后不会再次出现错误,我把本地配置的角色名改成了非超级角色,这下本地和在线配置就能一致了。

相关推荐
马克Markorg3 小时前
常见的向量数据库和具有向量数据库能力的数据库
数据库
Coder_Boy_5 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
helloworldandy5 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
数据知道7 小时前
PostgreSQL 故障排查:如何找出数据库中最耗时的 SQL 语句
数据库·sql·postgresql
qq_12498707537 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
枷锁—sha7 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
Coder_Boy_7 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Gain_chance7 小时前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
此生只爱蛋8 小时前
【Redis】主从复制
数据库·redis
马猴烧酒.8 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库