Oracle PROXY AUTHENTICATION机制允许代理用户(如U1118)以被代理用户(如ZLHIS)身份执行操作,但保留真实认证身份AUTHENTICATED_IDENTITY,授权须由被代理用户主动执行ALTER USER ZLHIS GRANT CONNECT THROUGH U1118,并通过PROXY_USERS视图实时验证。

直接给第三方系统配一个带密码的数据库账号是最危险的做法——它绕过了所有审计、权限隔离和会话溯源能力。Oracle 原生支持的 PROXY AUTHENTICATION 机制才是正确解法:用独立代理账号登录,但以目标应用用户身份执行操作,同时保留真实操作者痕迹。
代理授权必须由被代理用户主动发起
这不是“给 U1118 授权”,而是“ZLHIS 同意让 U1118 代自己登录”。语法主语不能错,否则立刻报 ORA-01937: missing or invalid role name:
- ❌ 错误写法:
ALTER USER U1118 GRANT CONNECT THROUGH ZLHIS - ✅ 正确写法:
ALTER USER ZLHIS GRANT CONNECT THROUGH U1118 - 授权后必须在同一个 PDB(或 CDB root)中执行,跨容器无效
- 如果目标用户是 PDB 用户,确保当前连接的是该 PDB,不是 CDB$ROOT
验证代理关系是否真正生效
SELECT USER FROM DUAL 永远返回 ZLHIS,这不能说明代理成功——它只是代理登录后的正常表现。唯一可信的验证方式是查 PROXY_USERS 视图:
- 运行:
SELECT * FROM PROXY_USERS WHERE CLIENT = 'U1118' AND PROXY = 'ZLHIS' - 有结果才代表授权已加载进内存;空结果说明授权未提交、连接串用了错误 service_name、或用户不在当前容器
- 该视图不缓存,
REVOKE CONNECT THROUGH后立即清空,适合实时确认
登录字符串和密码必须严格匹配代理逻辑
客户端连接时格式和密码来源极易出错:
- 连接字符串必须用方括号:
U1118[ZLHIS](不是圆括号、不是斜杠、不能省略) - 密码填的是
U1118的密码,不是ZLHIS的——即使ZLHIS是 DBA,也不能用它的密码登录这个代理会话 - JDBC 需显式启用:
oracle.jdbc.proxyClientName=U1118,否则会被当作直连 - OBClient、sqlplus、SQL Developer 均支持方括号语法,但旧版 SQL Developer 可能需升级驱动
AUTHENTICATED_IDENTITY 是唯一不可伪造的身份源
代理登录后,USER、SESSION_USER、PROXY_USER 全部返回 ZLHIS,只有这个字段能告诉你“谁真正在操作”:
- 查真实登录者:
SELECT SYS_CONTEXT('USERENV', 'AUTHENTICATED_IDENTITY') FROM DUAL→ 返回U1118 - 这个值由 Oracle 内核在认证阶段写入,中间件、应用层、甚至 DBA 都无法篡改
- 审计日志(
DBA_AUDIT_TRAIL)里OS_USERNAME和CLIENT_IDENTIFIER可能被伪造,但AUTHENTICATED_IDENTITY是越权排查的黄金依据 - 如果第三方系统做了连接池复用或中间代理转发,务必确认它没覆盖
CLIENT_IDENTIFIER,否则溯源链就断了











