最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2021年03月21日 08:20:10   作者:foucus、  
這篇文章主要介紹了Postgresql限制用戶(hù)登錄錯(cuò)誤次數(shù)的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

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

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

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

下載地址:

https://github.com/okbob/session_exec

下載解壓之后需要進(jìn)行以下配置:

  1. set session_preload_libraries to session_execset
  2. session_exec.login_name to name of your login function

該插件有以下特點(diǎn):

  1. 如果函數(shù)不存在則會(huì)進(jìn)行警告;
  2. 函數(shù)執(zhí)行失敗則不允許連接。

利用該插件我們可以寫(xiě)一個(gè)簡(jiǎn)單的函數(shù)來(lái)實(shí)現(xiàn)限制用戶(hù)登錄錯(cuò)誤次數(shù)的功能。

例子:

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

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ù)庫(kù)日志中的登錄信息。

create table t_login
(
login_time timestamp(3) with time zone --插入時(shí)間,
user_name text,
flag int --標(biāo)志位,0代表過(guò)期數(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; --獲取當(dāng)前日志中最新時(shí)間
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則鎖定用戶(hù)
loop
EXECUTE format('alter user %I nologin',res); --鎖定用戶(hù)
EXECUTE 'select pg_terminate_backend(pid) from pg_stat_activity where usename=$1' using res; --斷開(kāi)當(dāng)前被鎖定用戶(hù)會(huì)話(huà)
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、測(cè)試
模擬test1用戶(hù)登錄錯(cuò)誤超過(guò)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)

當(dāng)我們?cè)谑褂胻est1用戶(hù)登錄時(shí)則無(wú)法連接

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

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

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、解鎖用戶(hù)
此時(shí)想要解鎖該用戶(hù)則需要執(zhí)行:

bill=# alter user test1 login;
ALTER ROLE

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

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

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

到此這篇關(guān)于Postgresql限制用戶(hù)登錄錯(cuò)誤次數(shù)的文章就介紹到這了,更多相關(guān)Postgresql限制用戶(hù)登錄錯(cuò)誤次數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解如何在Ubuntu?18.04上安裝和使用PostgreSQL

    詳解如何在Ubuntu?18.04上安裝和使用PostgreSQL

    關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)是許多網(wǎng)站和應(yīng)用程序的關(guān)鍵組件,它們提供了一種結(jié)構(gòu)化的方式來(lái)存儲(chǔ)、組織和訪(fǎng)問(wèn)信息,本文演示了如何在?Ubuntu?18.04?VPS?實(shí)例上安裝?Postgres,并提供了基本數(shù)據(jù)庫(kù)管理的說(shuō)明,需要的朋友可以參考下
    2024-07-07
  • 如何使用PostgreSQL進(jìn)行中文全文檢索

    如何使用PostgreSQL進(jìn)行中文全文檢索

    PostgreSQL被稱(chēng)為是“最高級(jí)的開(kāi)源數(shù)據(jù)庫(kù)”,它的數(shù)據(jù)類(lèi)型非常豐富,用它來(lái)解決一些比較偏門(mén)的需求非常適合。由于PgSQL國(guó)內(nèi)的資料較少,所有本文將詳細(xì)介紹此類(lèi)問(wèn)題,以便后來(lái)的同學(xué)能順利使用PgSQL。
    2021-05-05
  • PostgresSql 多表關(guān)聯(lián)刪除語(yǔ)句的操作

    PostgresSql 多表關(guān)聯(lián)刪除語(yǔ)句的操作

    這篇文章主要介紹了PostgresSql 多表關(guān)聯(lián)刪除語(yǔ)句的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • PostgreSQL創(chuàng)建新用戶(hù)所遇見(jiàn)的權(quán)限問(wèn)題以及解決辦法

    PostgreSQL創(chuàng)建新用戶(hù)所遇見(jiàn)的權(quán)限問(wèn)題以及解決辦法

    這篇文章主要給大家介紹了關(guān)于PostgreSQL創(chuàng)建新用戶(hù)所遇見(jiàn)的權(quán)限問(wèn)題以及解決辦法, 在PostgreSQL中創(chuàng)建一個(gè)新用戶(hù)非常簡(jiǎn)單,但可能會(huì)遇到權(quán)限問(wèn)題,需要的朋友可以參考下
    2023-09-09
  • Linux 上 定時(shí)備份postgresql 數(shù)據(jù)庫(kù)的方法

    Linux 上 定時(shí)備份postgresql 數(shù)據(jù)庫(kù)的方法

    這篇文章主要介紹了Linux 上 定時(shí)備份postgresql 數(shù)據(jù)庫(kù)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • postgresql 實(shí)現(xiàn)啟動(dòng)、狀態(tài)查看、關(guān)閉

    postgresql 實(shí)現(xiàn)啟動(dòng)、狀態(tài)查看、關(guān)閉

    這篇文章主要介紹了postgresql 實(shí)現(xiàn)啟動(dòng)、狀態(tài)查看、關(guān)閉的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • PostgreSQL 慢查詢(xún)SQL跟蹤操作

    PostgreSQL 慢查詢(xún)SQL跟蹤操作

    這篇文章主要介紹了PostgreSQL 慢查詢(xún)SQL跟蹤操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • postgresql 循環(huán)函數(shù)的簡(jiǎn)單實(shí)現(xiàn)操作

    postgresql 循環(huán)函數(shù)的簡(jiǎn)單實(shí)現(xiàn)操作

    這篇文章主要介紹了postgresql 循環(huán)函數(shù)的簡(jiǎn)單實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • Postgresql?REGEXP開(kāi)頭的正則函數(shù)用法圖文詳解

    Postgresql?REGEXP開(kāi)頭的正則函數(shù)用法圖文詳解

    正則表達(dá)式是指一個(gè)用來(lái)描述或者匹配一系列符合某個(gè)句法規(guī)則的字符串的單個(gè)字符串,下面這篇文章主要給大家介紹了關(guān)于Postgresql?REGEXP開(kāi)頭的正則函數(shù)用法的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • 在postgresql中運(yùn)行sql文件并導(dǎo)出結(jié)果的操作

    在postgresql中運(yùn)行sql文件并導(dǎo)出結(jié)果的操作

    這篇文章主要介紹了在postgresql中運(yùn)行sql文件并導(dǎo)出結(jié)果的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01

最新評(píng)論

兴义市| 民勤县| 奈曼旗| 马鞍山市| 开远市| 宁蒗| 武功县| 昌吉市| 昌图县| 天气| 玉田县| 南和县| 长白| 东乡族自治县| 桦甸市| 隆林| 河池市| 湛江市| 英德市| 河南省| 云和县| 鄯善县| 东莞市| 古交市| 昆明市| 延吉市| 贡觉县| 栾川县| 东光县| 泰安市| 房产| 连城县| 洛浦县| 长春市| 陇西县| 淳安县| 钟祥市| 包头市| 福建省| 开江县| 大兴区|