这篇文章主要介绍了一种数据库系统限制用户登录错误次数的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下。
在神谕中我们可以通过设置失败_登录_尝试来限制用户密码登录错误的次数,但是在一种数据库系统中是不支持这个功能的。尽管一种数据库系统支持事件触发器,可是事件局限于DDL,对于登录登出事件是没办法使用事件触发器的。
不过像登录新建会话触发某个事件这个需求可以通过钩子实现,不过该方法比较复杂,需要修改内核代码,在客户端认证中添加逻辑,判断输入密码次数统计。这里推荐一种比较简单的方法实现类似的功能。
这里我们要使用到session_exec这个插件,使用该插件会在登录时执行一个指定的功能。
下载地址:
https://github.com/okbob/session_exec
下载解压之后需要进行以下配置:
将会话_预加载_库设置为session_execset
session_exec.login_name到登录函数的名称
该插件有以下特点:
如果函数不存在则会进行警告;
函数执行失败则不允许连接。
利用该插件我们可以写一个简单的函数来实现限制用户登录错误次数的功能。
例子:
1、建立外部表记录数据库日志信息。
创建服务器日志FOREDIAN数据包装器文件fdw(_ f)
创建外部表日志(
带时区的log_time时间戳(3 ),
用户名文本,
数据库名称文本,
进程id整数,
连接(_from)文本,
会话自我文本,
session_line_num bigint,
命令标签文本,
带有时区的会话开始时间时间戳,
虚拟事务id文本
transaction_id bigint,
错误严重性文本,
sql_state_code文本,
消息文本,
详细文本,
提示文本,
内部查询文本,
internal_query_pos integer,
上下文文本,
查询文本,
query_pos integer,
位置文本,
应用程序名称文本,
后端类型文本
)SERVER pglog
选项(程序查找$PGDATA/log -type f -name '* '。' CSV '-mtime-1-exec cat { } \;',格式为“CSV”);
2、创建表t_login提取数据库日志中的登录信息。
创建表t_login
(
带时区的login_time timestamp(3)插入时间,
用户名文本,
标志int -标志位,0代表过期数据
);
插入登录信息:
bill=# insert in t _ log in select log _ time,user_name from pglog其中command_tag='authentication '和error_severity='FATAL '