login_hook
在用户登陆时执行login_hook.login()函数
仓库
splendiddata/login_hook
https://github.com/splendiddata/login_hook
源码
login_hook-1.7.tar.gz
login_hook-1.7.tar.gz
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
login_hook | 1.7 | SEC | GPL-3.0 | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 7360 | login_hook | 否 | 是 | 否 | 是 | 否 | 否 | login_hook |
| 相关扩展 | pg_auth_mon credcheck set_user pg_permissions passwordcheck_cracklib pgaudit auth_delay passwordcheck |
|---|
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | MIXED | 1.7 | 1817161514 | login_hook | - |
| RPM | PGDG | 1.7 | 1817161514 | login_hook_$v | - |
| DEB | PIGSTY | 1.7 | 1817161514 | postgresql-$v-login-hook | - |
构建
您可以使用 pig build 命令构建 login_hook 扩展的 RPM / DEB 包:
pig build pkg login_hook # 构建 RPM / DEB 包
安装
您可以直接安装 login_hook 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
pig repo add pgsql -u # 添加仓库并更新缓存
使用 pig 或者是 apt/yum/dnf 安装扩展:
pig install login_hook; # 当前活跃 PG 版本安装
pig ext install -y login_hook -v 18 # PG 18
pig ext install -y login_hook -v 17 # PG 17
pig ext install -y login_hook -v 16 # PG 16
pig ext install -y login_hook -v 15 # PG 15
pig ext install -y login_hook -v 14 # PG 14
dnf install -y login_hook_18 # PG 18
dnf install -y login_hook_17 # PG 17
dnf install -y login_hook_16 # PG 16
dnf install -y login_hook_15 # PG 15
dnf install -y login_hook_14 # PG 14
apt install -y postgresql-18-login-hook # PG 18
apt install -y postgresql-17-login-hook # PG 17
apt install -y postgresql-16-login-hook # PG 16
apt install -y postgresql-15-login-hook # PG 15
apt install -y postgresql-14-login-hook # PG 14
创建扩展:
CREATE EXTENSION login_hook;
用法
login_hook 允许在用户登录数据库时执行自定义 PL/pgSQL 代码。
CREATE EXTENSION login_hook;
配置
添加到 postgresql.conf:
session_preload_libraries = 'login_hook'
创建登录函数
定义一个 login_hook.login() 函数,该函数将在每次登录时执行:
CREATE OR REPLACE FUNCTION login_hook.login() RETURNS VOID LANGUAGE PLPGSQL AS $$
BEGIN
IF NOT login_hook.is_executing_login_hook() THEN
RAISE EXCEPTION 'Should only be invoked by login_hook';
END IF;
-- 你的登录逻辑:
RAISE NOTICE 'Hello %', current_user;
EXCEPTION
WHEN OTHERS THEN
RAISE LOG 'Error in login_hook.login(): %', SQLERRM;
END
$$;
GRANT EXECUTE ON FUNCTION login_hook.login() TO PUBLIC;
需要 PUBLIC 授权,因为该函数会为每个连接用户运行。
函数
| 函数 | 返回类型 | 描述 |
|---|---|---|
login_hook.is_executing_login_hook() | boolean | 仅在登录钩子执行期间调用时返回 true |
login_hook.get_login_hook_version() | text | 返回 login_hook 的编译版本 |
login_hook.login() | void | 用户提供的在登录时执行的函数 |
重要说明
- 该函数不会在后台进程或恢复模式期间被调用
- 在函数内部处理所有异常 —— 失败将阻止普通用户登录
- 超级用户在函数失败时会收到警告但仍可登录
- 对于 PostgreSQL 17+,可考虑使用原生登录事件触发器