• 售前

  • 售后

热门帖子
入门百科

Postgresql限定用户登录错误次数的实例代码

[复制链接]
123456825 显示全部楼层 发表于 2021-8-14 15:14:18 |阅读模式 打印 上一主题 下一主题
在oracle中我们可以通过设置FAILED_LOGIN_ATTEMPTS来限定用户暗码登录错误的次数,但是在postgresql中是不支持这个功能的。只管PostgreSQL支持event trigger,但是event范围于DDL,对于登录登出事件是没办法利用event trigger的。
不外像登录新建会话触发某个事件这个需求可以通过hook实现,不外该方法比力复杂,必要修改内核代码,在客户端认证中添加逻辑,判定输入暗码次数统计。这里推荐一种比力简朴的方法实现雷同的功能。
这里我们要利用到session_exec这个插件,利用该插件会在登录时执行一个指定的function。
下载所在:


https://github.com/okbob/session_exec
下载解压之后必要举行以下设置:
      
  • set session_preload_libraries to session_execset  
  • session_exec.login_name to name of your login function
该插件有以下特点:
      
  • 如果函数不存在则会举行告诫;  
  • 函数执行失败则不允许连接。
利用该插件我们可以写一个简朴的函数来实现限定用户登录错误次数的功能。
例子:


1、创建外部表记录数据库日志信息。
  1. CREATE SERVER pglog FOREIGN DATA WRAPPER file_fdw;
  2. CREATE FOREIGN TABLE pglog (
  3. log_time timestamp(3) with time zone,
  4. user_name text,
  5. database_name text,
  6. process_id integer,
  7. connection_from text,
  8. session_id text,
  9. session_line_num bigint,
  10. command_tag text,
  11. session_start_time timestamp with time zone,
  12. virtual_transaction_id text,
  13. transaction_id bigint,
  14. error_severity text,
  15. sql_state_code text,
  16. message text,
  17. detail text,
  18. hint text,
  19. internal_query text,
  20. internal_query_pos integer,
  21. context text,
  22. query text,
  23. query_pos integer,
  24. location text,
  25. application_name text,
  26. backend_type text
  27. ) SERVER pglog
  28. OPTIONS ( program 'find $PGDATA/log -type f -name "*.csv" -mtime -1 -exec cat {} \;', format 'csv' );
复制代码
2、创建表t_login提取数据库日志中的登录信息。
  1. create table t_login
  2. (
  3. login_time timestamp(3) with time zone --插入时间,
  4. user_name text,
  5. flag int --标志位,0代表过期数据
  6. );
复制代码
插入登录信息:
  1. bill=# insert into t_login select log_time,user_name from pglog where command_tag='authentication' and error_severity= 'FATAL'
  2. bill-# ;
  3. INSERT 0 4
复制代码
3、创建登录执行的function
  1. create or replace function lock_user() returns void as $$
  2. declare
  3. res text;
  4. c1 timestamp(3) with time zone;
  5. begin
  6. select login_time from t_login where flag = 0 order by login_time desc limit 1 into c1; --获取当前日志中最新时间
  7. insert into t_login select log_time,user_name from pglog where command_tag='authentication' and error_severity= 'FATAL' and log_time > c1; --将最新的数据插入t_login表
  8. update t_login set flag = 1 where login_time > c1;
  9. for res in select user_name from t_login where flag = 1 group by user_name having count(*) >=3 --检查登录失败次数是否大于3,若大于3则锁定用户
  10. loop
  11. EXECUTE format('alter user %I nologin',res); --锁定用户
  12. EXECUTE 'select pg_terminate_backend(pid) from pg_stat_activity where usename=$1' using res; --断开当前被锁定用户会话
  13. raise notice 'Account % is locked!',res;
  14. end loop;
  15. end;
  16. $$ language plpgsql strict;
复制代码
4、编辑postgresql.conf文件,设置登录函数
  1. session_preload_libraries='session_exec'
  2. session_exec.login_name='lock_user'
复制代码
5、测试
模拟test1用户登录错误高出3次:
  1. bill=# select * from t_login;
  2.      login_time     | user_name | flag
  3. ----------------------------+-----------+------
  4. 2020-08-26 07:26:45.42+08 | test1   |  1
  5. 2020-08-26 07:26:50.179+08 | test1   |  1
  6. 2020-08-26 07:26:52.487+08 | test1   |  1
  7. 2020-08-26 07:26:54.537+08 | test1   |  1
  8. (4 rows)
复制代码
当我们在利用test1用户登录时则无法连接
  1. pg13@cnndr4pptliot-> psql bill test1
  2. Password for user test1:
  3. NOTICE: c1 = <NULL>
  4. psql: error: could not connect to server: FATAL: terminating connection due to administrator command
  5. CONTEXT: SQL statement "select pg_terminate_backend(pid) from pg_stat_activity where usename=$1"
  6. PL/pgSQL function lock_user() line 13 at EXECUTE
复制代码
再次登录可以看到提示该用户被锁定:
  1. pg13@cnndr4pptliot-> psql bill test1
  2. Password for user test1:
  3. psql: error: could not connect to server: FATAL: role "test1" is not permitted to log in
复制代码
6、解锁用户
此时想要解锁该用户则必要执行:
  1. bill=# alter user test1 login;
  2. ALTER ROLE
复制代码
然后必要注意还要将t_login中逾期的数据修改。
  1. bill=# update t_login set flag = 0;
  2. UPDATE 4
复制代码
参考链接:
https://github.com/okbob/session_exec
到此这篇关于Postgresql限定用户登录错误次数的文章就先容到这了,更多相关Postgresql限定用户登录错误次数内容请搜索草根技术分享以前的文章或继续欣赏下面的相关文章希望各人以后多多支持草根技术分享!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作