PostgreSQL 练习 ---- psql 新增连接参数
目标
添加一个连接参数,默认为 false 。当 psql 连接时,若该连接参数非 “true” 时,用户 “u1“ 对表对象无操作权限,包括自己拥有的表。
连接机制简介
连接过程如下所述:
- 客户端初始化一个空连接,设置连接状态为 CONNECTION_NEEDED 。
- 然后创建 socket,与服务端建立 tcp 连接,状态设置为 CONNECTION_STARTED ,检查 socket 连接是否正常。
- 初始化连接中的 socket 地址,修改连接状态为 CONNECTED_MODE 。
- 给服务端发送协议号等信息,发送启动包给服务端后,设置状态为 CONNECTION_AWAITING_RESPONSE 。
- 处理身份验证交换,等待 postmaster 消息并根据需要作出响应,最终设置状态为 CONNECTION_AUTH_OK。(后续过程再次不再细述,有兴趣可以自己查资料进行学习)。
我们重点关注启动包,因为参数的发送、解析都是通过启动包完成。启动包不止包含了连接协议,还包含了些连接选项等信息( dbname、user 等)。此次连接参数的发送解析就在启动包中。
实现
此处以添加 conninfo 为例:
确定标志为 priv_flag,默认为 false ,并设置为全局变量。确定连接参数为 char* 型的变量 privilege_flag 。
定义全局变量 priv_flag
在 src/backend/utils/init/globals.c 文件中定义
bool priv_flag = false;
并在 src/include/miscadmin.h 中声明此变量
extern bool priv_flag;
在 Port 和 conn 结构体中添加字段
主要目的是在建立连接的过程中,对该参数的赋值发送和接受,进行处理。pg_conn 为客户端存储连接状态结构体,Port 为服务端相关联结构体。
在 src/include/libpq/libpq-be.h 文件的 Port 结构体中添加 privilege_flag 字段:
char *privilege_flag;
src/interfaces/libpq/libpq-int.h 文件中 pg_conn 结构体同理添加:
char *privilege_flag;
在 conninfo 中添加 privilege_flag
psql 首先会对命令行 -选项 的命令进行解析,未匹配的“”引号里面的信息,会在客户端填充第一包数据之前,进行解析,此时依赖的就是 conninfo 结构体,去进行匹配。
在 src/interfaces/libpq/fe-connect.c 文件中定义的结构体 PQconninfoOptions 中添加新添参数信息。
internalPQconninfoOption 结构体定义 conninfo 参数及其回退资源。
添加新参数信息至倒数第二个成员,因最后一个为全NULL,遍历时到此停止。
{"privilege_flag", "PRIVILEGE_FLAG", NULL, NULL,"Privilege-Flag", "", 8, /* sizeof("true") = 5 or sizeof("false") = 6 */offserof(struct pg_conn, privilege_flag)},
用以参数解析时进行匹配。
在客户端填充启动包数据
在 src/interfaces/libpq/fe-protocol3.c 文件 build_startup_packet
函数中添加相关代码。对 privilege_flag 参数的值进行填充。
if (conn->privilege_flag && conn->privilege_flag[0])ADD_STARTUP_OPTION("privilege_flag", conn->privilege_flag);
服务端解析启动包
在 src/backend/postmaster/postmaster.c 文件的 ProcessStartupPacket
函数对第一包数据进行解析。
当读取到 privilege_flag 参数,且值为 true 时,置全局变量 priv_flag 为 true ,否则继续使用默认值。
else if(strcmp(nameptr, "privilege_flag") == 0){port->privilege_flag = pstrdup(valptr);if(strcmp("true",port->privilege_flag) == 0){priv_flag = true;}}
设置权限检查判断
在 src/backend/catalog/aclchk.c 文件的 pg_class_aclmask
函数中,对权限检查增加逻辑判断。
当前用户为“u1”,且全局变量 priv_flag 为 false 时,在权限检查这块“去除”该用户对表对象的 insert/update/delete/truncate 权限(前提是 u1 拥有该表的这些权限)。即通过 privilege_flag 连接参数控制 u1 用户的权限。
if(strcmp(GetUserNameFromId(roleid, false), "u1") == 0 && !priv_flag){mask &= ~(ACL_INSERT | ACL_UPDATE | ACL_DELETE | ACL_TRUNCATE);ReleaseSyscache(tuple);return mask;}
测试验证
- 首先使用 postgres 用户登录数据库,创建 u1 用户
create user u1 with password '1qaz!QAZ';
- 然后创建 public 表 test ,并赋其所有权限给 u1 用户
create table public.test (id int);
insert into test values (1),(2),(3),(4),(5);
grant all ON test to u1 ;
- 通过 pg_class 表查看 u1 用户对表 test 的权限
select relname,relacl from pg_class where relname = 'test';
- 使用 u1 用户进行登录。因当使用 -d、-U 参数时,“”里面的参数就会被忽略,所以使用全 conninfo 的方式进行登录。
首先不使用 privilege_flag 参数进行连接,进行 select/insert 操作
可以看到 select 权限正常,insert 操作提示没有权限。
接下来使用 privilege_flag=true 进行连接,再次进行 select/insert 操作:
可以看到,此时 insert 操作正常。
相关文章:

PostgreSQL 练习 ---- psql 新增连接参数
目标 添加一个连接参数,默认为 false 。当 psql 连接时,若该连接参数非 “true” 时,用户 “u1“ 对表对象无操作权限,包括自己拥有的表。 连接机制简介 连接过程如下所述: 客户端初始化一个空连接,设置…...

pdf翻译软件哪个好用?多语言轻松转
想知道怎么用pdf翻译器在线翻译吗?无需复杂操作,一键即可解锁语言障碍。 在这个全球化日益加深的时代,掌握pdf文件的快速翻译技巧尤为重要。 无论是学习、工作还是国际交流,以下4个免费pdf翻译技巧都将是你不可或缺的得力助手。…...

培训第三十天(ansible模块的使用)
上午 ansible是⼀种由Python开发的⾃动化运维⼯具,集合了众多运维⼯ 具(puppet、cfengine、chef、func、fabric)的优点,实现了批量 系统配置、批量程序部署、批量运⾏命令等功能。 1、学习ansible的使用 ansible 主机ip|域名|组…...

关于Log4net的使用记录——无法生成日志文件输出
关于Log4net的使用记录 前言遇到的问题具体使用总结前言 最近在使用log4net进行日志记录,保存一些需要的数据,以便后期使用需要。在使用的时候出现没有生成日志文件,针对这些问题,发现解决的办法! 遇到的问题 报错,提示没有找到对应的文件。 log4net:ERROR Failed to f…...
golang Kratos 概念
"Kratos"指的是一个开源的微服务框架,它用于构建高性能和可扩展的云原生应用。Kratos框架提供了一套丰富的工具和库,旨在简化微服务的开发和维护。下面是Kratos框架的一些基本概念: 服务构建与注册: gRPC与HTTP服务&…...

入门 MySQL 数据库:基础指南
简介 MySQL 是一个非常流行的开源关系型数据库管理系统(RDBMS),广泛用于 Web 应用、企业应用和数据仓库。本博客将引导你从零开始,学习 MySQL 数据库的基础知识。 什么是 MySQL? MySQL 是一个基于 SQL(Str…...

【Hexo系列】【3】使用GitHub自带的自定义域名解析
上一期我们通过学习【Hexo系列】【2】使用Vercel加速Hexo博客访问使用Vercel进行GitHub同步与加速,有时候Vercel也不太稳定访问不了。本身GitHub也是支持自定义域名的,本次教程将讲解如何使用GitHub自带的自定义域名解析。 1. GitHub设置 1.1 登录GitH…...

智能监控,无忧仓储:EasyCVR视频汇聚+AI智能分享技术为药品仓库安全保驾护航
随着科技的飞速发展,药品仓库的安全管理正迎来前所未有的变革。药品作为直接关系到公众健康的重要物资,其安全存储和监管显得尤为重要。在这个背景下,视频汇聚平台EasyCVR视频智能管理系统的应用,为药品仓库的安全监管提供了强有力…...

本地创建PyPI镜像
背景: 在安装一些库时,经常需要反复下载包(有的体积比较大,所以会比较慢),所以考虑在本地创建一个pypi镜像,把常用的库缓存下来,这样安装就会很省事.比较从本地安装库和从服务器下载会快很多. 安装使用 安装:pip install devpi 初始化: devpi-init --serverdirF:\pypioutput…...

使用 Elasticsearch RestHighLevelClient 进行查询
Elasticsearch 提供了多种客户端库,以方便不同编程语言的用户进行操作。其中,Java 的 RestHighLevelClient 是 Elasticsearch 官方推荐的客户端之一,用于 Java 应用程序中。本文将介绍如何使用 Java 的 RestHighLevelClient 进行 Elasticsear…...
【jvm】符号引用
目录 1. 说明2. 特点3. 组成与格式4. 作用5. 过程 1. 说明 1.在Java虚拟机中,符号引用(Symbolic Reference)是一种重要的引用机制。2.它主要用于在编译阶段和类加载阶段之间建立对类、方法、字段等元素的引用关系。3.符号引用是指用一个符号…...
征服云端:Java微服务与Docker容器化之旅
引言 随着云计算技术的迅猛发展,越来越多的企业开始拥抱云原生技术。在这个过程中,微服务架构以其独特的魅力成为了众多开发者的首选方案。而Docker作为容器化领域的佼佼者,在微服务部署与管理方面扮演着不可或缺的角色。本文将带你深入了解…...

python 如何实现执行selenium自动化测试用例自动录屏?
做自动化测试已经好多年了,随着项目技术的正增长提升,我们也不断完善并提高自己的技术能力, 下面给大家分享一个 selenium 自动化执行测试用例的录屏功能。希望对大家有帮助! 首先,我们为什么要执行自动化录屏功能呢…...

03 网络编程 TCP传输控制协议
目录 1、TCP基本特征 2、TCP通信流程基本原理 (1)基本原理 (2)TCP通信代码实现 (3)核心API解析 1)地址绑定--bind 2)设置监听-listen 3)等待连接请求-accept-产生一个已连接套接字 4&a…...

1. 数据结构——顺序表的主要操作
1. 内容 顺序表的初始化、插入、删除、按值查找、输出以及其时间复杂度的计算。 2.代码 #include<stdio.h> #include<stdlib.h> //函数结果状态代码 #define OK 1 #define OVERFLOW -2 #define ERROR 0 #define MAXSIZE 100typedef int ElemType; //顺序表每个…...

[openSSL]TLS 1.3握手分析
文章目录 前言一、ECDHE密钥交换二、TLS单向身份认证三、TLS双向身份认证 前言 关于TLS握手网上资料很多,但是有一些写的很不清楚,导致学习时对概念和流程出现混淆,以下是我觉得写得比较清晰和准确的供学习参考。 浅析 TLS(ECDHE…...

无人机之螺旋桨的安装与维护
一、安装:正确安装桨叶至关重要。请确保顺时针旋转的桨叶安装在对应的电机上,并使逆时针旋转的桨叶安装在相应的电机上。否则,无人机可能无法正常飞行或失去控制。 二、维护:为了确保无人机的安全及长久使用,请定期检…...

手机设备IP地址切换:方法、应用与注意事项
在当今数字化时代,手机已成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐,手机都扮演着重要角色。然而,随着网络环境的日益复杂,有时我们需要切换手机设备的IP地址以满足特定的需求,如保护隐私、绕过地…...

华为HCIP证书好考吗?详解HCIP证书考试难易程度及备考策略!
华为认证体系主要分为三个层次:HCIA(Huawei Certified ICT Associate),HCIP(Huawei Certified ICT Professional)和HCIE(Huawei Certified Internetwork Expert)。作为中级认证,HCIP证书主要面向具备一定技术基础和项目实践能力的专业人士。在…...

《SPSS零基础入门教程》学习笔记——05.模型入门
文章目录 5.1 回归模型5.2 分类模型5.3 降维和刻度模型5.4 生存分析和时间序列模型 5.1 回归模型 线性回归(分析 -> 回归 -> 线性)曲线估计(分析 -> 回归 -> 曲线估计) 二元Logistic回归(分析 -> 回归…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
起重机起升机构的安全装置有哪些?
起重机起升机构的安全装置是保障吊装作业安全的关键部件,主要用于防止超载、失控、断绳等危险情况。以下是常见的安全装置及其功能和原理: 一、超载保护装置(核心安全装置) 1. 起重量限制器 功能:实时监测起升载荷&a…...

aurora与pcie的数据高速传输
设备:zynq7100; 开发环境:window; vivado版本:2021.1; 引言 之前在前面两章已经介绍了aurora读写DDR,xdma读写ddr实验。这次我们做一个大工程,pc通过pcie传输给fpga,fpga再通过aur…...

若依项目部署--传统架构--未完待续
若依项目介绍 项目源码获取 #Git工具下载 dnf -y install git #若依项目获取 git clone https://gitee.com/y_project/RuoYi-Vue.git项目背景 随着企业信息化需求的增加,传统开发模式存在效率低,重复劳动多等问题。若依项目通过整合主流技术框架&…...