Postgresql限制用戶登錄錯(cuò)誤次數(shù)的實(shí)例代碼
在oracle中我們可以通過設(shè)置FAILED_LOGIN_ATTEMPTS來限制用戶密碼登錄錯(cuò)誤的次數(shù),但是在postgresql中是不支持這個(gè)功能的。盡管PostgreSQL支持event trigger,可是event局限于DDL,對(duì)于登錄登出事件是沒辦法使用event trigger的。
不過像登錄新建會(huì)話觸發(fā)某個(gè)事件這個(gè)需求可以通過hook實(shí)現(xiàn),不過該方法比較復(fù)雜,需要修改內(nèi)核代碼,在客戶端認(rèn)證中添加邏輯,判斷輸入密碼次數(shù)統(tǒng)計(jì)。這里推薦一種比較簡(jiǎn)單的方法實(shí)現(xiàn)類似的功能。
這里我們要使用到session_exec這個(gè)插件,使用該插件會(huì)在登錄時(shí)執(zhí)行一個(gè)指定的function。
下載地址:
https://github.com/okbob/session_exec
下載解壓之后需要進(jìn)行以下配置:
- set session_preload_libraries to session_execset
- session_exec.login_name to name of your login function
該插件有以下特點(diǎn):
- 如果函數(shù)不存在則會(huì)進(jìn)行警告;
- 函數(shù)執(zhí)行失敗則不允許連接。
利用該插件我們可以寫一個(gè)簡(jiǎn)單的函數(shù)來實(shí)現(xiàn)限制用戶登錄錯(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代表過期數(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則鎖定用戶 loop EXECUTE format('alter user %I nologin',res); --鎖定用戶 EXECUTE 'select pg_terminate_backend(pid) from pg_stat_activity where usename=$1' using res; --斷開當(dāng)前被鎖定用戶會(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用戶登錄錯(cuò)誤超過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用戶登錄時(shí)則無法連接
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、解鎖用戶
此時(shí)想要解鎖該用戶則需要執(zhí)行:
bill=# alter user test1 login; ALTER ROLE
然后需要注意還要將t_login中過期的數(shù)據(jù)修改。
bill=# update t_login set flag = 0; UPDATE 4
參考鏈接:
https://github.com/okbob/session_exec
到此這篇關(guān)于Postgresql限制用戶登錄錯(cuò)誤次數(shù)的文章就介紹到這了,更多相關(guān)Postgresql限制用戶登錄錯(cuò)誤次數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- PostGreSql 判斷字符串中是否有中文的案例
- PostgreSQL的中文拼音排序案例
- 自定義函數(shù)實(shí)現(xiàn)單詞排序并運(yùn)用于PostgreSQL(實(shí)現(xiàn)代碼)
- PostgreSQL將數(shù)據(jù)加載到buffer cache中操作方法
- 在PostgreSQL中使用ltree處理層次結(jié)構(gòu)數(shù)據(jù)的方法
- postgresql 中的時(shí)間處理小技巧(推薦)
- PostgreSQL用戶登錄失敗自動(dòng)鎖定的處理方案
- postgresql影子用戶實(shí)踐場(chǎng)景分析
- 如何使用PostgreSQL進(jìn)行中文全文檢索
相關(guān)文章
Postgresql JSON對(duì)象和數(shù)組查詢功能實(shí)現(xiàn)
這篇文章主要介紹了Postgresql JSON對(duì)象和數(shù)組查詢功能實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11在PostgreSQL中實(shí)現(xiàn)數(shù)據(jù)的自動(dòng)清理和過期清理
在 PostgreSQL 中,可以通過多種方式實(shí)現(xiàn)數(shù)據(jù)的自動(dòng)清理和過期處理,以確保數(shù)據(jù)庫(kù)不會(huì)因?yàn)榇鎯?chǔ)過多過時(shí)或不再需要的數(shù)據(jù)而導(dǎo)致性能下降和存儲(chǔ)空間浪費(fèi),本文給大家介紹了一些常見的方法及詳細(xì)示例,需要的朋友可以參考下2024-07-07PostgreSQL中使用dblink實(shí)現(xiàn)跨庫(kù)查詢的方法
這篇文章主要介紹了PostgreSQL中使用dblink實(shí)現(xiàn)跨庫(kù)查詢的方法,需要的朋友可以參考下2017-05-05pgsql添加自增序列、設(shè)置表某個(gè)字段自增操作
這篇文章主要介紹了pgsql添加自增序列、設(shè)置表某個(gè)字段自增操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12PostgreSQL實(shí)時(shí)查看數(shù)據(jù)庫(kù)實(shí)例正在執(zhí)行的SQL語(yǔ)句實(shí)例詳解
在任何數(shù)據(jù)庫(kù)中,分析和優(yōu)化SQL的執(zhí)行,最重要的工作就是執(zhí)行計(jì)劃的解讀,而說到執(zhí)行計(jì)劃得先了解postgresql的查詢執(zhí)行過程,下面這篇文章主要給大家介紹了關(guān)于PostgreSQL實(shí)時(shí)查看數(shù)據(jù)庫(kù)實(shí)例正在執(zhí)行的SQL語(yǔ)句的相關(guān)資料,需要的朋友可以參考下2023-01-01基于postgresql數(shù)據(jù)庫(kù)鎖表問題的解決
這篇文章主要介紹了基于postgresql數(shù)據(jù)庫(kù)鎖表問題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12在postgresql數(shù)據(jù)庫(kù)中判斷是否是數(shù)字和日期時(shí)間格式函數(shù)操作
這篇文章主要介紹了在postgresql數(shù)據(jù)庫(kù)中判斷是否是數(shù)字和日期時(shí)間格式函數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12