<address id="x349r"></address>
    <label id="x349r"></label>
      <menu id="x349r"><acronym id="x349r"></acronym></menu>
    1. 新聞: 服務熱線:010-56153651/136-9361-0533
      在線溝通
      599385821
      010-56153651

      Postgresql限制用戶登錄錯誤次數(shù)的實例代碼

      發(fā)布時間:2023-03-18 來源:北京思睿鴻途科技有限公司 作者:[ 北京網(wǎng)站制作 · 思睿鴻途 ] 訪問量:2016

      這篇文章主要介紹了Postgresql限制用戶登錄錯誤次數(shù)的實例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下。

      在oracle中我們可以通過設置FAILED_LOGIN_ATTEMPTS來限制用戶密碼登錄錯誤的次數(shù),但是在postgresql中是不支持這個功能的。盡管PostgreSQL支持event trigger,可是event局限于DDL,對于登錄登出事件是沒辦法使用event trigger的。

      不過像登錄新建會話觸發(fā)某個事件這個需求可以通過hook實現(xiàn),不過該方法比較復雜,需要修改內(nèi)核代碼,在客戶端認證中添加邏輯,判斷輸入密碼次數(shù)統(tǒng)計。這里推薦一種比較簡單的方法實現(xiàn)類似的功能。

      這里我們要使用到session_exec這個插件,使用該插件會在登錄時執(zhí)行一個指定的function。

      下載地址:

      https://github.com/okbob/session_exec

      下載解壓之后需要進行以下配置:

      set session_preload_libraries to session_execset

      session_exec.login_name to name of your login function

      該插件有以下特點:

      如果函數(shù)不存在則會進行警告;

      函數(shù)執(zhí)行失敗則不允許連接。

      利用該插件我們可以寫一個簡單的函數(shù)來實現(xiàn)限制用戶登錄錯誤次數(shù)的功能。

      例子:

      1、建立外部表記錄數(shù)據(jù)庫日志信息。

      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、創(chuàng)建表t_login提取數(shù)據(jù)庫日志中的登錄信息。

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

       

      插入登錄信息:

      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、創(chuàng)建登錄執(zhí)行的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; --將最新的數(shù)據(jù)插入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 --檢查登錄失敗次數(shù)是否大于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文件,配置登錄函數(shù)

      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 =

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

      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、解鎖用戶

      此時想要解鎖該用戶則需要執(zhí)行:

      bill=# alter user test1 login;
      ALTER ROLE

      然后需要注意還要將t_login中過期的數(shù)據(jù)修改。

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


      聯(lián)系我們


      地址:北京市朝陽區(qū)湯立路218號7層

      電話:010-56153651

      郵箱:[email protected]


      歡迎您來到北京思睿鴻途科技有限公司,我們專注
      北京網(wǎng)站建設、北京企業(yè)網(wǎng)站運維服務。

      <address id="x349r"></address>
      <label id="x349r"></label>
        <menu id="x349r"><acronym id="x349r"></acronym></menu>
      1. 日本91视频 | 亚洲成人性爱网 | 男人叉女人动态图 | www.十八禁 | 精品三级视频 |