中国手工加工网免费供货/seo快速排名软件
目标
添加一个连接参数,默认为 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回归(分析 -> 回归…...

如何用不到一分钟的时间将Excel电子表格转换为应用程序
我们大多数人对电子表格又爱又恨。当企业需要分析数据、为决策过程提供信息并可视化信息时,Excel和Google Sheets是首选。这些文档非常容易创建,它们帮助我们以直接的方式构建相关的想法和适用的数据。除此之外,事情可能会变得一团糟。 对于…...

WordPress 中 cURL 请求出现 504 网关超时错误的解决方法
错误原因 504网关超时错误通常发生在服务器作为网关或代理,不能在规定的时间内得到响应时。在WordPress中,这可能是因为目标服务器响应过慢,或请求的队列过长导致的。 解决方案 首先,您应该检查您的cURL请求是否设置了一个合理的…...

事件和委托的区别
在C#中,事件(Event)和委托(Delegate)是紧密相关但具有不同含义的概念。以下是它们的主要区别: 委托(Delegate): 委托是一种类型,它表示一个方法的签名(即方法…...

低功耗蓝牙协议栈如何学习?
目录 1. 基础知识 1.1 了解BLE基本概念 1.2 阅读BLE规范 2. 实践和开发工具 2.1 使用开发板 2.2 安装开发环境 3. 学习资源 3.1 官方文档和示例 3.2 在线课程和教程 4. 实践项目 4.1 简单项目 4.2 复杂项目 5. 深入理解协议栈 5.1 分析协议栈 5.2 调试和分析 6…...

ROS 2中,CMakeList.txt常见语法
在ROS 2中,CMakeList.txt 文件扮演着配置和管理构建过程的重要角色。这个文件遵循CMake的语法,用于定义如何编译和链接源代码。下面是一些在ROS 2项目CMakeList.txt文件中常见的语法和用法。 1. 基本结构和命令 cmake_minimum_required(VERSION )&…...

使用 prefetchComponents 进行组件预取
title: 使用 prefetchComponents 进行组件预取 date: 2024/8/17 updated: 2024/8/17 author: cmdragon excerpt: 摘要:本文介绍Nuxt.js中的prefetchComponents功能,用于预取组件以提高用户体验。通过在客户端后台下载和缓存组件,确保在用户…...

『 C++ 』IO流
文章目录 IO流概述iostream 的标准对象C流和C标准库I/O函数的同步 sync_with_stdiofstream 文件流文件流的打开标志二进制读写二进制读写的浅拷贝问题文本读写 字符串流注意 IO流概述 流是指数据的有序传输序列,路表示数据从一个地方流向另一个地方的过程,流可以是输入流也可以…...

enhanced Input Action IA_Look中Action value引脚没有分割结构体引脚的选项
UE5系列文章目录 文章目录 UE5系列文章目录前言二、使用步骤解决办法 前言 据说,unreal engine5中准备废弃“项目设置”中“输入”,操作映射,轴映射。取而代之的是: 使用增强的输入动作(Enhanced Input Actions&#…...

C# NetworkStream、ConcurrentDictionary、Socket类、SerialPort、局域网IP 和广域网IP
一、NetworkStream 什么是NetworkStream? NetworkStream 是 .NET Framework 中用于在网络上进行数据传输的流类。它属于System.Net.Sockets 命名空间,并提供了通过网络连接进行读写操作的功能。NetworkStream 主要用于处理从网络套接字(Soc…...

大模型--学习范式
1. 自监督学习(Self-Supervised Learning) 概念:自监督学习是一种特殊形式的监督学习,其中标签不是由人工标注的,而是从输入数据本身自动生成的。模型利用这些自动生成的标签进行训练。自监督学习通常用于预训练阶段&…...