当前位置: 首页 > news >正文

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;}

测试验证

  1. 首先使用 postgres 用户登录数据库,创建 u1 用户
create user u1 with password '1qaz!QAZ';
  1. 然后创建 public 表 test ,并赋其所有权限给 u1 用户
create table public.test (id int);
insert into test values (1),(2),(3),(4),(5);
grant all ON test to u1 ;
  1. 通过 pg_class 表查看 u1 用户对表 test 的权限
    在这里插入图片描述
select relname,relacl from pg_class where relname = 'test';
  1. 使用 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握手网上资料很多&#xff0c;但是有一些写的很不清楚&#xff0c;导致学习时对概念和流程出现混淆&#xff0c;以下是我觉得写得比较清晰和准确的供学习参考。 浅析 TLS&#xff08;ECDHE…...

无人机之螺旋桨的安装与维护

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

手机设备IP地址切换:方法、应用与注意事项

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

华为HCIP证书好考吗?详解HCIP证书考试难易程度及备考策略!

华为认证体系主要分为三个层次&#xff1a;HCIA(Huawei Certified ICT Associate)&#xff0c;HCIP(Huawei Certified ICT Professional)和HCIE(Huawei Certified Internetwork Expert)。作为中级认证&#xff0c;HCIP证书主要面向具备一定技术基础和项目实践能力的专业人士。在…...

《SPSS零基础入门教程》学习笔记——05.模型入门

文章目录 5.1 回归模型5.2 分类模型5.3 降维和刻度模型5.4 生存分析和时间序列模型 5.1 回归模型 线性回归&#xff08;分析 -> 回归 -> 线性&#xff09;曲线估计&#xff08;分析 -> 回归 -> 曲线估计&#xff09; 二元Logistic回归&#xff08;分析 -> 回归…...

Audacity:5分钟快速掌握免费音频编辑的终极指南

Audacity&#xff1a;5分钟快速掌握免费音频编辑的终极指南 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 想要专业级的音频编辑能力却不想支付高昂的费用&#xff1f;Audacity正是你寻找的解决方案&#xff01;…...

基于相关分析法与M序列的系统脉冲响应抗噪辨识技术

1. 噪声环境下的系统辨识挑战 在工业控制和信号处理领域&#xff0c;系统辨识就像给一个黑箱系统做"体检"。想象一下医生通过观察病人对各种刺激的反应来判断病情&#xff0c;工程师们也是通过分析系统对输入信号的响应来了解系统特性。但现实世界从来不是安静的实验…...

用Neural Renderer和PyTorch搞定3D车辆模型渲染:从.obj文件到Carla数据集实战

3D车辆模型渲染实战&#xff1a;Neural Renderer与Carla数据集深度整合指南 在自动驾驶和计算机视觉领域&#xff0c;逼真的3D车辆模型渲染技术正成为算法开发和测试的关键环节。传统渲染方法往往难以平衡效率与真实感&#xff0c;而基于神经网络的渲染技术为解决这一难题提供了…...

使用 Aspen Plus 模拟天然气的自热转化

使用aspen plus模拟天然气的自热转化自热重整工艺消耗蒸汽和氧气&#xff0c;将天然气转化为合成气。 事实上&#xff0c;自热转化工艺是放热的部分氧化&#xff08;POX&#xff09;工艺和内热的蒸汽甲烷转化&#xff08;SMR&#xff09;工艺的结合&#xff0c;从热力学角度中和…...

给嵌入式新手的ST7789驱动避坑指南:从SPI模式到RGB565显示的完整配置流程

给嵌入式新手的ST7789驱动避坑指南&#xff1a;从SPI模式到RGB565显示的完整配置流程 第一次接触ST7789液晶驱动芯片时&#xff0c;面对厚厚的数据手册和复杂的时序图&#xff0c;很多嵌入式新手都会感到无从下手。本文将带你一步步拆解ST7789的驱动过程&#xff0c;从SPI模式配…...

从零搭建RAG知识库系统:手把手带你玩转检索增强生成,解决大模型三大痛点!

在探索AI落地应用的过程中&#xff0c;RAG知识库系统是一项无法回避的关键技术。近期我开始系统学习这一领域&#xff0c;并决定以笔记形式持续记录和分享学习心得&#xff0c;一方面督促自己深入理解&#xff0c;另一方面也希望能与大家共同探讨、相互启发。 本文整理自我对RA…...

三步搞定全网资源下载:手把手教你使用res-downloader网络资源嗅探工具

三步搞定全网资源下载&#xff1a;手把手教你使用res-downloader网络资源嗅探工具 【免费下载链接】res-downloader 资源下载器、网络资源嗅探&#xff0c;支持微信视频号下载、网页抖音无水印下载、网页快手无水印视频下载、酷狗音乐下载等网络资源拦截下载! 项目地址: http…...

LongCat动物百变秀快速入门:上传图片+输入文字=神奇效果

LongCat动物百变秀快速入门&#xff1a;上传图片输入文字神奇效果 1. 认识动物百变秀 你是否想过给家里的宠物猫换个造型&#xff1f;或者把普通的狗狗照片变成威风凛凛的狼&#xff1f;LongCat动物百变秀让这些想象变成现实。这是一个基于美团开源技术的智能图片编辑工具&am…...

告别纸上谈兵:用Wireshark抓包实战分析FlexRay帧格式(含CRC校验)

实战解析FlexRay帧格式&#xff1a;用Wireshark抓包验证CRC与网络管理向量 车载工程师们常遇到这样的困境&#xff1a;明明熟读FlexRay协议文档&#xff0c;面对真实总线数据时却无从下手。本文将带您用Wireshark完成从抓包到解析的全流程实战&#xff0c;重点破解Header CRC校…...

WebPageTest API完全手册:自动化网站性能监控与集成

WebPageTest API完全手册&#xff1a;自动化网站性能监控与集成 【免费下载链接】WebPageTest Official repository for WebPageTest 项目地址: https://gitcode.com/gh_mirrors/we/WebPageTest WebPageTest 是一款强大的网站性能测试工具&#xff0c;其提供的 API 功能…...