postgresql 源码客户端认证

news/2024/7/7 19:22:20
--在使用pg中登陆数据库是第一步,其代码结构如下:

--原始代码在如下文件中
src/backend/libpq/auth.c

--其入口函数为ClientAuthentication,其接受一个Port结构体
void
ClientAuthentication(Port *port)
{

    --通过此函数解析客户的ip类型,确定其使用的是什么样的方式进行认证,比如能过local还是ip,是md5还是trust认证等
    -- hba_getauthmethod 会调用函数 check_hba()
    hba_getauthmethod(port);
    CHECK_FOR_INTERRUPTS();

    --匹配pg的认证方法,比如我们最常用的md5
    switch (port->hba->auth_method)
    {
        case uaReject:
        case uaMD5:
            if (Db_user_namespace)
                ereport(FATAL,
                        (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
                         errmsg("MD5 authentication is not supported when \"db_user_namespace\" is enabled")));
            --提示用户输入密码并对用户输入的密码进行加密
            sendAuthRequest(port, AUTH_REQ_MD5);
            --比较用户输入的密码与数据库中存在的密码是否一致,其会调用md5_crypt_verify函数
            status = recv_and_check_password_packet(port, &logdetail);
            break;
    }
    --检查系统中中是否有hook,如果有,则调用
    if (ClientAuthentication_hook)
        (*ClientAuthentication_hook) (port, status);
    --判断用户认证是否成功
    if (status == STATUS_OK)
        sendAuthRequest(port, AUTH_REQ_OK);
    else
        --如果认证失败,则发送失败信息给客户端
        auth_failed(port, status, logdetail);
}



--通过check_hba函数的foreach可知,pg是从上往下匹配pg_hba.conf的文件内容,如果为满足则其返回
--故在pg_hba.conf上面的认证方式如果与下面的认证方式会覆盖下面的认证方式
static void check_hba(hbaPort *port)
{
	Oid			roleid;
	ListCell   *line;
	HbaLine    *hba;

	/* Get the target role's OID.  Note we do not error out for bad role. */
	roleid = get_role_oid(port->user_name, true);
    --一行一行的对比pg_hba.conf的内容,直到匹配
	foreach(line, parsed_hba_lines)
	{
		hba = (HbaLine *) lfirst(line);

		/* Check connection type */
		if (hba->conntype == ctLocal)
		{
			if (!IS_AF_UNIX(port->raddr.addr.ss_family))
				continue;
		}
		else
		{
            do something;
		}						/* != ctLocal */

		/* Check database and role */
		if (!check_db(port->database_name, port->user_name, roleid,
					  hba->databases))
			continue;

		if (!check_role(port->user_name, roleid, hba->roles))
			continue;

		/* Found a record that matched! */
		port->hba = hba;
		return;
	}

	/* If no matching entry was found, then implicitly reject. */
	hba = palloc0(sizeof(HbaLine));
	hba->auth_method = uaImplicitReject;
	port->hba = hba;
}




--比较用户输入的密码与数据库中存在的密码是否一致
int md5_crypt_verify(const Port *port, const char *role, char *client_pass,
				 char **logdetail)
{
    --根据用户名,获取系统缓存的数据库密码
	datum = SysCacheGetAttr(AUTHNAME, roleTup,
							Anum_pg_authid_rolpassword, &isnull);
	if (isnull)
	{
		ReleaseSysCache(roleTup);
		*logdetail = psprintf(_("User \"%s\" has no password assigned."),
							  role);
		return STATUS_ERROR;	/* user has no password */
	}
	shadow_pass = TextDatumGetCString(datum);
 
    --比较密码是否相同
	if (strcmp(crypt_client_pass, crypt_pwd) == 0)
	{
		/*
		 * Password OK, now check to be sure we are not past rolvaliduntil
		 */
		if (isnull)
			retval = STATUS_OK;
		else if (vuntil < GetCurrentTimestamp())
		{
			*logdetail = psprintf(_("User \"%s\" has an expired password."),
								  role);
			retval = STATUS_ERROR;
		}
		else
			retval = STATUS_OK;
	}

	return retval;
}


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

相关文章

MingW编译virt-viewer

在http://www.spice-space.org/download.html可以下载到windows版本的virt viewer virt-viewer-x86-0.5.7.msi和virt-viewer-x64-0.5.7.msi是使用MingW编译出来的&#xff0c;源码就是使用virt-viewer-0.5.7.tar.gz 如果需要定制virt viewer&#xff0c;就需要从源码编译出可执…

Atlassian、Slack 以及 ChatOps 未来的前景如何?

2019独角兽企业重金招聘Python工程师标准>>> 在大家纷纷谈起 DevOps 和 ChatOps 的时候&#xff0c;Martin Giles 也对 ChatOps 的前景有自己的看法。他曾是《经济学人》的记者&#xff0c;现在是 Wing Venture Capital&#xff08;Wing_VC&#xff09;合伙人。本文…

linux gif录制工具,教学?演示?在Linux下安装超好用的屏幕录像机来录制gif动画...

原标题&#xff1a;教学&#xff1f;演示&#xff1f;在Linux下安装超好用的屏幕录像机来录制gif动画正文许多朋友问在Ubuntu下有哪些好用又简单的录屏软件&#xff0c;今天为大家推荐Peek。简单的屏幕录像机&#xff0c;易于使用的界面。在今年的2月18日&#xff0c;Linux上GI…

JGroups 初探

2019独角兽企业重金招聘Python工程师标准>>> 最近研究 JAVA 集群技术&#xff0c;看到 jgroups 这个框架&#xff0c;网上有些例子&#xff0c;非常简单。 可以参考其官方网址&#xff1a;http://www.jgroups.org/manual/index.html 按捺不住&#xff0c;自己还是动…

android 各行自动对齐,Android导航布局项左右对齐

我想在android片段中创建工具栏菜单。菜单布局代码:xmlns:app"http://schemas.android.com/apk/res-auto" >android:id"id/back_arrow"android:title"back"android:gravity"left"android:layout_gravity"left"android:ic…

android app进入动画效果,如何在Android应用中利用Dialog实现一个动画效果

如何在Android应用中利用Dialog实现一个动画效果发布时间&#xff1a;2020-12-02 17:25:34来源&#xff1a;亿速云阅读&#xff1a;96作者&#xff1a;Leah今天就跟大家聊聊有关如何在Android应用中利用Dialog实现一个动画效果&#xff0c;可能很多人都不太了解&#xff0c;为了…

【mongoDB高级篇②】大数据聚集运算之mapReduce(映射化简)

简述 mapReduce从字面上来理解就是两个过程&#xff1a;map映射以及reduce化简。是一种比较先进的大数据处理方法&#xff0c;其难度不高&#xff0c;从性能上来说属于比较暴力的&#xff08;通过N台服务器同时来计算&#xff09;&#xff0c;但相较于group以及aggregate来说&a…

android坐标画图软件下载,地图坐标app下载-地图坐标软件下载v4.8.15 安卓版-西西软件下载...

地图坐标app是一款免费好用的地图坐标显示软件&#xff0c;用户只需要地图上轻轻一点就可以得知目标位置的经纬度和地址等信息&#xff0c;同时还能通过短信等方式与他人共享。此外&#xff0c;地图坐标app还为用户提供了距离测量、当前卫星导航位置等专业工具供有需要的用户使…