Oracle代理用户不提供免密连接,仅转移密码验证对象;授权必须由被代理用户执行ALTER USER ZLHIS GRANT CONNECT THROUGH U1118,通过PROXY_USERS视图验证,登录后用SYS_CONTEXT('USERENV','AUTHENTICATED_IDENTITY')获取真实认证账号U1118。

Oracle 代理用户本身不提供“免密连接”,它只是把密码验证从被代理用户转移到代理用户身上——你仍需知道代理用户的密码。所谓“免密”,实际是配合 OS 认证、Wallet 或连接池策略实现的组合方案,不是代理功能自带的。
ALTER USER ... GRANT CONNECT THROUGH 语法必须写对
代理权限由被代理用户主动授予,不是 DBA 替代执行。常见错误是把主语和宾语颠倒:
- 错误写法:
ALTER USER U1118 GRANT CONNECT THROUGH ZLHIS→ 直接报ORA-00922: missing or invalid option - 正确写法:
ALTER USER ZLHIS GRANT CONNECT THROUGH U1118→ 必须用ZLHIS账户登录后执行(哪怕它是 schema-only 用户) - 授权后立即生效,无需重启;撤销同理:
ALTER USER ZLHIS REVOKE CONNECT THROUGH U1118
验证代理关系是否生效,只看 PROXY_USERS 视图
别查 DBA_USERS 或 ALL_USERS,它们不记录代理映射。唯一可信来源是:
SELECT * FROM PROXY_USERS WHERE CLIENT = 'U1118' AND PROXY = 'ZLHIS';
有结果就代表已启用;空结果说明没授权、拼写大小写不一致(Oracle 默认大写)、或已被 REVOKE。注意:CLIENT 是真正认证的账号(U1118),PROXY 是权限归属账号(ZLHIS)。
登录后如何拿到真实连接者身份?用 AUTHENTICATED_IDENTITY
用 U1118[ZLHIS] 方式登录后,USER、SESSION_USER、SYS_CONTEXT('USERENV', 'PROXY_USER') 全部返回 ZLHIS,无法区分是谁连进来的。
唯一不可伪造的是:
SELECT SYS_CONTEXT('USERENV', 'AUTHENTICATED_IDENTITY') FROM DUAL;→ 返回 U1118。审计、日志、权限校验逻辑必须依赖这个值,而不是 CLIENT_IDENTIFIER(后者默认为空,且需应用层显式调用 setClientIdentifier() 设置)。
想真正“免密”,得叠加其他机制
代理用户只是跳板,要绕过密码输入,还得选一种底层认证方式:
- OS 认证:确保
U1118是操作系统用户,并配置os_authent_prefix(如默认ops$则建ops$u1118),再让该 OS 用户能sqlplus /连接 - Oracle Wallet:把
U1118的密码存进 Wallet,JDBC 连接串写成jdbc:oracle:thin:/@mydb,并配-Doracle.net.wallet_location=... - 连接池重用:在 UCP/Hikari 中借出连接后,用
setClientIdentifier()标记会话,但必须每次归还前清空,否则残留上一个用户标识
代理 + Wallet 是最常见生产组合;代理 + OS 认证仅限本地部署且需严格对齐组权限、前缀、sqlnet.ora 参数——稍有偏差就 fallback 到密码校验,报 ORA-01017。


















