1. <i id="s6b2k"><small id="s6b2k"></small></i>
    <b id="s6b2k"><bdo id="s6b2k"></bdo></b>
  2. <wbr id="s6b2k"></wbr>

    Postgresql限制用戶登錄錯誤次數的實例代碼_PostgreSQL

    來源:腳本之家  責任編輯:小易  

    在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、建立外部表記錄數據庫日志信息。

    CREATE SERVER pglog FOREIGN DATA WRAPPER file_fdw;
    
    CREATE FOREIGN TABLE pglog ( 
     log_time timestamp(3) with time zone, 
     user_name text, 
     database_name text, 
     process_id integer,
     connection_from text,
     session_id text, 
     session_line_num bigint, 
     command_tag text, 
     session_start_time timestamp with time zone, 
     virtual_transaction_id text, 
     transaction_id bigint, 
     error_severity text, 
     sql_state_code text, 
     message text, 
     detail text, 
     hint text, 
     internal_query text, 
     internal_query_pos integer, 
     context text, 
     query text, 
     query_pos integer, 
     location text, 
     application_name text,
     backend_type text 
    ) SERVER pglog 
    OPTIONS ( program 'find $PGDATA/log -type f -name "*.csv" -mtime -1 -exec cat {} \;', format 'csv' ); 

    2、創建表t_login提取數據庫日志中的登錄信息。

    create table t_login
    (
    login_time timestamp(3) with time zone --插入時間,
    user_name text,
    flag int --標志位,0代表過期數據
    );

    插入登錄信息:

    bill=# insert into t_login select log_time,user_name from pglog where command_tag='authentication' and error_severity= 'FATAL'
    bill-# ;
    INSERT 0 4

    3、創建登錄執行的function

    create or replace function lock_user() returns void as $$
    declare
    res text;
    c1 timestamp(3) with time zone;
    begin
    select login_time from t_login where flag = 0 order by login_time desc limit 1 into c1; --獲取當前日志中最新時間
    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表
    update t_login set flag = 1 where login_time > c1; 
    for res in select user_name from t_login where flag = 1 group by user_name having count(*) >=3 --檢查登錄失敗次數是否大于3,若大于3則鎖定用戶
    loop
    EXECUTE format('alter user %I nologin',res); --鎖定用戶
    EXECUTE 'select pg_terminate_backend(pid) from pg_stat_activity where usename=$1' using res; --斷開當前被鎖定用戶會話
    raise notice 'Account % is locked!',res;
    end loop;
    end;
    $$ language plpgsql strict;

    4、編輯postgresql.conf文件,配置登錄函數

    session_preload_libraries='session_exec'
    session_exec.login_name='lock_user'

    5、測試
    模擬test1用戶登錄錯誤超過3次:

    bill=# select * from t_login;
         login_time     | user_name | flag 
    ----------------------------+-----------+------
     2020-08-26 07:26:45.42+08 | test1   |  1
     2020-08-26 07:26:50.179+08 | test1   |  1
     2020-08-26 07:26:52.487+08 | test1   |  1
     2020-08-26 07:26:54.537+08 | test1   |  1
    (4 rows)

    當我們在使用test1用戶登錄時則無法連接

    pg13@cnndr4pptliot-> psql bill test1
    Password for user test1: 
    NOTICE: c1 = <NULL>
    psql: error: could not connect to server: FATAL: terminating connection due to administrator command
    CONTEXT: SQL statement "select pg_terminate_backend(pid) from pg_stat_activity where usename=$1"
    PL/pgSQL function lock_user() line 13 at EXECUTE

    再次登錄可以看到提示該用戶被鎖定:

    pg13@cnndr4pptliot-> psql bill test1
    Password for user test1: 
    psql: error: could not connect to server: FATAL: role "test1" is not permitted to log in

    6、解鎖用戶
    此時想要解鎖該用戶則需要執行:

    bill=# alter user test1 login;
    ALTER ROLE

    然后需要注意還要將t_login中過期的數據修改。

    bill=# update t_login set flag = 0;
    UPDATE 4

    參考鏈接:
    https://github.com/okbob/session_exec

    到此這篇關于Postgresql限制用戶登錄錯誤次數的文章就介紹到這了,更多相關Postgresql限制用戶登錄錯誤次數內容請搜索真格學網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持真格學網!

    您可能感興趣的文章:PostgreSQL用戶登錄失敗自動鎖定的處理方案PostgreSQL 實現登錄及修改密碼操作

  3. 本文相關:
  4. postgresql 實現修改jsonb字段中的某一個值
  5. 基于postgresql查詢某個字段屬于哪個表的說明
  6. postgresql 對in,exists,any/all,join的sql優化方案
  7. 詳解postgresql提升批量數據導入性能的n種方法
  8. postgresql判斷字符串是否包含目標字符串的多種方法
  9. postgresql中like和ilike操作符的用法詳解
  10. 解決postgresql無法遠程訪問的情況
  11. 快速解決postgresql中的permission denied問題
  12. 修改一行代碼提升 postgres 性能 100 倍
  13. postgresql 中round函數的用法說明
  14. PostgreSQL的用戶,角色跟權限管理怎么解決
  15. postgressql數據庫登錄提示"postgres" password 認...
  16. 寫數據到PostgreSQL數據庫錯誤問題,怎么解決
  17. 2003 系統,過幾天報PostgreSQL錯誤,請高人指點,...
  18. 急!!使用命令行進入psql時總是提示我“用戶admini...
  19. pgsql錯誤代碼: 42830是什么意思
  20. postgresql的連接超時問題,誰知道在連接字符串寫...
  21. win10下,postgresql 連接失敗,用戶驗證失敗
  22. PostgreSQL 密碼過期如何設置
  23. Postgresql 連接錯誤
  24. 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess數據庫文摘數據庫其它首頁postgresqlpostgresql用戶登錄失敗自動鎖定的處理方案postgresql 實現登錄及修改密碼操作postgresql 實現修改jsonb字段中的某一個值基于postgresql查詢某個字段屬于哪個表的說明postgresql 對in,exists,any/all,join的sql優化方案詳解postgresql提升批量數據導入性能的n種方法postgresql判斷字符串是否包含目標字符串的多種方法postgresql中like和ilike操作符的用法詳解解決postgresql無法遠程訪問的情況快速解決postgresql中的permission denied問題修改一行代碼提升 postgres 性能 100 倍postgresql 中round函數的用法說明postgresql 角色與用戶管理介紹windows下postgresql數據庫的下載windows下postgresql安裝圖解postgresql中的oid和xid 說明15個postgresql數據庫實用命令分postgresql alter語句常用操作小windows postgresql 安裝圖文教程postgresql 安裝和簡單使用postgresql 創建表分區postgresql新手入門教程postgresql中enable、disable和validate外如何查看postgres數據庫端口postgresql教程(十七):客戶端命令(1)postgresql去掉表中所有不可見字符的操作ubuntu中卸載postgresql出錯的解決方法postgresql教程(十一):服務器配置postgresql 賦予用戶權限和撤銷權限的實例postgresql 如何選擇正確的關閉模式查看postgresql數據庫用戶系統權限、對象關于postgresql錯誤日志與慢查詢日志收集
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.yu113.com All Rights Reserved
    战天txt全集下载