Postgresql怎么限制用户登录错误次数

  介绍

小编给大家分享一下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怎么限制用户登录错误次数