我有需要审核Postgres中的表格的情况。
但是在Postgres中没有可以从中获得操作系统用户的功能或方法。
请建议我如何在Postgres或EDB中获得操作系统用户。
此外,pg_available_extensions
表格中的扩展名为insert_username
。
这可以用来获取OS用户。如果是,可以如何使用。
答案 0 :(得分:1)
对于一般情况,你不能,因为PostgreSQL通过网络套接字与客户端通信。没有可靠的方法来确定来自远程主机的TCP / IP连接的操作系统用户名。
对于unix域套接字,可以要求连接用户与使用peer
模式身份验证的PostgreSQL用户相同。 PostgreSQL没有将客户端操作系统用户名从unix域套接字暴露给SQL,因此如果你使用其他身份验证方法,即使它们通过unix域套接字连接,你也很容易找到他们的用户名。
对于环回TCP / IP连接,主机操作系统可能会运行一个identd,尽管这几天几乎没有。这可能允许PostgreSQL向对方询问用户名是什么。它通过ident
auth方法支持此功能,但与peer
类似,一旦用户连接,您就无法从SQL请求操作系统用户名。
对于其他用户,您无法可靠地找出他们在主机操作系统上的用户。您只需要相信客户告诉您的内容,并且修改客户端以便撒谎是微不足道的。
您甚至无法使用C扩展函数获取此信息,因为PostgreSQL在身份验证完成后无法记住它,并且对于大多数身份验证方法,它从不首先向客户端询问它。这将需要协议更改。由于客户端只能说谎主机操作系统用户名,所以似乎没有多大意义。
如果要验证客户端身份,SSL客户端证书或Kerberos(SSPI,在Windows上)身份验证将是更好的选择。
答案 1 :(得分:0)
您将不得不依赖于在会话/事务上下文变量中提供信息的客户端,例如使用Postgres' SET
command:
SET LOCAL audit.AUDIT_USER = 'whatever-you-like';
This answer to a related question介绍了如何基于此实现审核。
如果您的客户端是Java应用程序,您可能还希望使用上述方法查看实现INSERTED_BY
/ UPDATED_BY
审核的demo Gist。