我们有一个登录触发器,它通过 IP 限制访问:
IF UPPER(v_username) = 'CDEPROD' THEN
IF SYS_CONTEXT('USERENV', 'IP_ADDRESS') NOT IN
('192.168.170.52',
'192.168.170.40',
'192.168.170.43',
'192.168.170.54',
'192.168.170.53',
'192.168.170.58')
OR SYS_CONTEXT('USERENV', 'IP_ADDRESS') IS NULL THEN
RAISE_APPLICATION_ERROR(-20001, 'Can not log in from this IP address (' || SYS_CONTEXT('USERENV', 'IP_ADDRESS') || ')');
END IF;
END IF;
Run Code Online (Sandbox Code Playgroud)
所以,触发器工作。但是,从本地,我无法以 CDEPROD 用户身份登录,它会引发应用程序错误。我想试试 127.0.0.1,但是没有用......
允许本地登录有什么技巧吗?
一般来说,并且只有在绝对必要时,最好使用操作系统级防火墙或(如果您有 Oracle 企业版)Oracle 连接管理器而不是登录触发器来处理通过 IP 地址限制登录。请参阅我去年就该主题撰写的这篇博文:https : //pmdba.wordpress.com/2020/02/18/how-to-limit-a-user-connection-to-a-specific-ip-address/
关键是硬编码 IP 地址为高开销维护噩梦打开了一扇门(因为地址容易更改,有时会频繁更改),因为 IP 地址(以及几乎所有其他 SYS_CONTEXT 参数)相对容易获得很少或没有安全增益欺骗一个精明的 Java 程序员。我会建议回到绘图板,你应该首先问:“我要解决的问题是什么?”