Part01-基础概念与理论知识
1.1 代理认证原理
风哥教程参考Oracle官方文档Security部分。Oracle代理认证允许一个用户(代理用户)代表另一个用户(被代理用户)连接到数据库,同时保留被代理用户的身份信息。这在应用程序需要以不同用户身份执行操作但又不想管理多个密码时非常有用。更多视频教程www.fgedu.net.cn
1.2 代理认证的类型
1. 完整代理认证:代理用户可以完全代表被代理用户执行所有操作;2. 限制代理认证:代理用户只能在特定权限范围内代表被代理用户执行操作。
1.3 代理认证的优势
1. 简化应用程序的用户认证管理;2. 提供更细粒度的权限控制;3. 保留审计信息中的原始用户身份;4. 支持集中式认证和授权。
Part02-生产环境规划与建议
2.1 代理用户规划
生产环境建议创建专用的代理用户,用于应用程序连接数据库。代理用户应该具有最小的系统权限,仅允许执行代理认证操作。
2.2 权限规划
根据业务需求,规划代理用户的权限范围。可以使用限制代理认证,仅允许代理用户执行特定的操作,如SELECT、INSERT、UPDATE等。
2.3 审计规划
配置适当的审计策略,记录代理认证的使用情况,包括代理用户、被代理用户、执行的操作等信息。
Part03-生产环境项目实施方案
3.1 创建被代理用户
创建需要被代理的数据库用户。
$ sqlplus / as sysdba
# 创建被代理用户
SQL> CREATE USER fgedu_user IDENTIFIED BY fgedu123;User created.
# 授予基本权限
SQL> GRANT CONNECT, RESOURCE TO fgedu_user;Grant succeeded.
# 创建表
SQL> CREATE TABLE fgedu_user.emp (id NUMBER, name VARCHAR2(50), salary NUMBER);Table created.
SQL> INSERT INTO fgedu_user.emp VALUES (1, ‘风哥1号’, 5000);1 row created.
SQL> COMMIT;Commit complete.
3.2 创建代理用户
创建用于代理认证的用户。
SQL> CREATE USER fgedu_proxy IDENTIFIED BY proxy123;User created.
# 授予CONNECT权限
SQL> GRANT CONNECT TO fgedu_proxy;Grant succeeded.
3.3 配置完整代理认证
配置代理用户可以完全代表被代理用户执行操作。
SQL> ALTER USER fgedu_user GRANT CONNECT THROUGH fgedu_proxy;User altered.
# 验证代理权限
SQL> SELECT proxy, client, auth_control, flags
FROM dba_proxies;PROXY CLIENT AUTH_CONTROL FLAGS
—————————— —————————— ———— ——————–
FGEDU_PROXY FGEDU_USER NO PROXY MAY ACTIVATE ALL CLIENT ROLES
3.4 配置限制代理认证
配置代理用户只能在特定权限范围内代表被代理用户执行操作。
SQL> ALTER USER fgedu_user REVOKE CONNECT THROUGH fgedu_proxy;User altered.
# 创建角色并授予权限
SQL> CREATE ROLE fgedu_readonly_role;Role created.
SQL> GRANT SELECT ON fgedu_user.emp TO fgedu_readonly_role;Grant succeeded.
# 配置限制代理认证
SQL> ALTER USER fgedu_user GRANT CONNECT THROUGH fgedu_proxy WITH ROLE fgedu_readonly_role;User altered.
# 验证代理权限
SQL> SELECT proxy, client, auth_control, flags
FROM dba_proxies;PROXY CLIENT AUTH_CONTROL FLAGS
—————————— —————————— ———— ——————–
FGEDU_PROXY FGEDU_USER NO PROXY MAY ACTIVATE ONLY GIVEN ROLES
3.5 配置带认证的代理
配置代理用户需要提供被代理用户的密码才能进行代理认证。
SQL> ALTER USER fgedu_user REVOKE CONNECT THROUGH fgedu_proxy;User altered.
# 配置带认证的代理
SQL> ALTER USER fgedu_user GRANT CONNECT THROUGH fgedu_proxy AUTHENTICATED USING PASSWORD;User altered.
# 验证代理权限
SQL> SELECT proxy, client, auth_control, flags
FROM dba_proxies;PROXY CLIENT AUTH_CONTROL FLAGS
—————————— —————————— ———— ——————–
FGEDU_PROXY FGEDU_USER YES PROXY MAY ACTIVATE ALL CLIENT ROLES
Part04-生产案例与实战讲解
4.1 使用完整代理认证连接
使用代理用户连接数据库,并代表被代理用户执行操作。
SQL> ALTER USER fgedu_user GRANT CONNECT THROUGH fgedu_proxy;User altered.
# 使用代理认证连接数据库
$ sqlplus fgedu_proxy[fgedu_user]/proxy123@fgedudb
SQL*Plus: Release 19.0.0.0.0 – Production on Thu Mar 31 13:00:00 2026
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.3.0.0.0
SQL> SHOW USER;USER is “FGEDU_USER”
SQL> SELECT * FROM emp;ID NAME SALARY
———- ————————————————– ———-
1 风哥1号 5000
SQL> INSERT INTO emp VALUES (2, ‘风哥2号’, 6000);1 row created.
SQL> COMMIT;Commit complete.
SQL> SELECT * FROM emp;ID NAME SALARY
———- ————————————————– ———-
1 风哥1号 5000
2 风哥2号 6000
4.2 使用限制代理认证连接
使用限制代理用户连接数据库,验证权限限制。
SQL> ALTER USER fgedu_user REVOKE CONNECT THROUGH fgedu_proxy;SQL> ALTER USER fgedu_user GRANT CONNECT THROUGH fgedu_proxy WITH ROLE fgedu_readonly_role;User altered.
# 使用限制代理认证连接数据库
$ sqlplus fgedu_proxy[fgedu_user]/proxy123@fgedudb
SQL*Plus: Release 19.0.0.0.0 – Production on Thu Mar 31 13:10:00 2026
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.3.0.0.0
SQL> SHOW USER;USER is “FGEDU_USER”
SQL> SELECT * FROM emp;ID NAME SALARY
———- ————————————————– ———-
1 风哥1号 5000
2 风哥2号 6000
# 尝试执行INSERT操作,应该失败
SQL> INSERT INTO emp VALUES (3, ‘风哥3号’, 7000);INSERT INTO emp VALUES (3, ‘风哥3号’, 7000)
*
ERROR at line 1:
ORA-01031: insufficient privileges
SQL> ROLLBACK;Rollback complete.
4.3 使用带认证的代理连接
使用带认证的代理连接数据库,需要提供被代理用户的密码。学习交流加群风哥QQ113257174
SQL> ALTER USER fgedu_user REVOKE CONNECT THROUGH fgedu_proxy;SQL> ALTER USER fgedu_user GRANT CONNECT THROUGH fgedu_proxy AUTHENTICATED USING PASSWORD;User altered.
# 使用带认证的代理连接数据库,需要提供被代理用户的密码
$ sqlplus fgedu_proxy[fgedu_user]/proxy123@fgedudb
Enter password for user FGEDU_USER:
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.3.0.0.0
SQL> SHOW USER;USER is “FGEDU_USER”
SQL> SELECT * FROM emp;ID NAME SALARY
———- ————————————————– ———-
1 风哥1号 5000
2 风哥2号 6000
4.4 配置应用程序使用代理认证
在应用程序中配置使用代理认证连接数据库。
import java.sql.*;public class ProxyAuthExample {
public static void main(String[] args) {
try {
// 加载驱动
Class.forName(“oracle.jdbc.OracleDriver”);// 代理认证连接字符串
String url = “jdbc:oracle:thin:@db.fgedu.net.cn:1521:fgedudb”;String proxyUser = “fgedu_proxy”;String proxyPassword = “proxy123”;String targetUser = “fgedu_user”;// 创建代理认证属性
java.util.Properties prop = new java.util.Properties();prop.setProperty(“user”, proxyUser);prop.setProperty(“password”, proxyPassword);prop.setProperty(“oracle.jdbc.proxy_client_name”, targetUser);// 建立连接
Connection conn = DriverManager.getConnection(url, prop);// 执行查询
Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(“SELECT * FROM emp”);// 处理结果
while (rs.next()) {
System.out.println(“ID: ” + rs.getInt(“id”) + “, Name: ” + rs.getString(“name”) + “, Salary: ” +
rs.getInt(“salary”));}
// 关闭连接
rs.close();stmt.close();conn.close();} catch (Exception e) {
e.printStackTrace();}
}
}
4.5 审计代理认证
配置审计策略,记录代理认证的使用情况。
SQL> ALTER SYSTEM SET audit_trail = ‘DB’ SCOPE = SPFILE;System altered.
# 重启数据库
SQL> SHUTDOWN IMMEDIATE;SQL> STARTUP;# 审计代理认证
SQL> AUDIT SESSION BY fgedu_proxy BY ACCESS;Audit succeeded.
# 使用代理认证连接后,查询审计记录
SQL> SELECT username, os_username, proxy_sessionid, client_id, to_char(timestamp, ‘YYYY-MM-DD HH24:MI:SS’)
login_time
FROM dba_audit_session
WHERE username = ‘FGEDU_USER’
ORDER BY timestamp DESC;USERNAME OS_USERNAME PROXY_SESSIONID CLIENT_ID LOGIN_TIME
—————————— —————————— ————— ——————–
——————-
FGEDU_USER oracle FGEDU_USER 2026-03-31 13:20:00
Part05-风哥经验总结与分享
1. 代理认证是Oracle数据库中强大的安全特性,适用于应用程序需要以不同用户身份执行操作的场景。风哥提示:生产环境建议使用限制代理认证,避免代理用户获得过多权限。
2. 代理认证可以简化应用程序的用户管理,同时保留审计信息中的原始用户身份。
3. 带认证的代理可以提供额外的安全层,确保只有知道被代理用户密码的人才能使用代理认证。
4. 在应用程序中使用代理认证时,需要注意连接字符串的正确配置。更多学习教程公众号风哥教程itpux_com
5. 定期审计代理认证的使用情况,及时发现异常访问和权限滥用。
6. 结合Oracle的其他安全特性,如VPD(虚拟私有数据库),可以进一步增强系统的安全性。from oracle:www.itpux.com
学习交流加群风哥微信: itpux-com
