介绍下载地址:
https://github.com/okbob/session_exec 例子:
小编给大家分享一下Postgresql怎么限制用户登录错误次数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
在oracle中我们可以通过设置FAILED_LOGIN_ATTEMPTS来限制用户密码登录错误的次数,但是在Postgresql中是不支持这个功能的。尽管Postgresql支持事件触发,可是事件局限于DDL,对于登录登出事件是没办法使用事件触发的。
不过像登录新建会话触发某个事件这个需求可以通过钩实现,不过该方法比较复杂,需要修改内核代码,在客户端认证中添加逻辑,判断输入密码次数统计。这里推荐一种比较简单的方法实现类似的功能。
这里我们要使用到session_exec这个插件,使用该插件会在登录时执行一个指定的函数。
下载地址:
https://github.com/okbob/session_exec
下载解压之后需要进行以下配置:
- <李>
设置session_preload_libraries session_execset
李> <李>session_exec。login_name名称登录功能
李>该插件有以下特点:
- <李>
如果函数不存在则会进行警告;
李> <李>函数执行失败则不允许连接。
李>利用该插件我们可以写一个简单的函数来实现限制用户登录错误次数的功能。
例子:
1,建立外部表记录数据库日志信息。
CREATE SERVER pglog FOREIGN DATA WRAPPER file_fdw; CREATE FOREIGN  TABLE pglog (, 时间戳(3),log_time with time 区,, user_name 文本,大敌; database_name 文本,大敌; ,process_id 整数, ,connection_from 文本, session_id 文本,大敌; session_line_num 长整型数字,大敌; command_tag 文本,大敌; ,session_start_time timestamp  with time 区,, virtual_transaction_id 文本,大敌; transaction_id 长整型数字,大敌; error_severity 文本,大敌; sql_state_code 文本,大敌; message 文本,大敌; detail 文本,大敌; hint 文本,大敌; internal_query 文本,大敌; internal_query_pos 整数,大敌; context 文本,大敌; query 文本,大敌; query_pos 整数,大敌; 的位置,文本,大敌; ,application_name 文本, ,backend_type text ),SERVER pglog OPTIONS (, program & # 39; find PGDATA美元/log -type f -name “* .csv", -mtime 1, -exec cat {}, \; & # 39;,, format & # 39; csv # 39;,),
2,创建表t_login提取数据库日志中的登录信息。
create table t_login ( 时间戳(3)login_time with time zone ——插入时间, user_name 文本, flag int ——标志位0代表过期数据 );
插入登录信息:
比尔=#,insert into t_login select log_time, user_name 得到pglog where command_tag=& # 39;验证# 39;,以及error_severity=, & # 39;致命的# 39; 比尔- #,; INSERT 0, 4
3,创建登录执行的函数
create 或是replace function lock_user (), returns void as $ $ 声明 res 文本; c1 时间戳(3),with time 区域; 开始 select login_time 得到t_login where  flag =, 0, order by login_time desc limit 1, into c1;,——获取当前日志中最新时间 insert into  t_login select log_time user_name 得到pglog where command_tag=& # 39;验证# 39;,以及error_severity=, & # 39;致命的# 39;,以及log_time 祝辞,c1;,——将最新的数据插入t_login表 update t_login  set flag =, 1, where login_time 祝辞,c1,, for res  select 拷贝;user_name 得到t_login where flag =, 1, group by user_name having count(*),祝辞=3,——检查登录失败次数是否大于3,若大于3则锁定用户 循环 EXECUTE 格式(& # 39;alter  user %小姐:nologin& # 39; (res);,,锁定用户 EXECUTE & # 39; select  pg_terminate_backend (pid),得到pg_stat_activity where usename=$ 1 & # 39;, using res;,——断开当前被锁定用户会话 raise notice & # 39; Account %, is 锁! & # 39;res; 最终获得;循环; 结束; $ $,language plpgsql 严格的;Postgresql怎么限制用户登录错误次数