Proxy Authentication
在學習cx_Oracle訪問Oracle資料庫時, 下載作者的原始碼,發現作者在測試的資料庫指令碼中建立使用者即使用了代理授權。當時沒有 太注意,最近正好總結作半年以來的工作,想起來就先測試下,以作備忘。
代理認證
cx_Oracle中建立使用者指令碼
... ... create user cx_Oracle identified by "password" quota unlimited on dba_data default tablespace dba_data temporary tablespace dba_tmp; create user cx_Oracle_proxy identified by "password"; alter user cx_Oracle_proxy grant connect through cx_Oracle; grant create session to cx_Oracle_proxy; grant create session, create table, create procedure, create type to cx_Oracle; ... ...
代理認證測試
建立代理/被代理使用者
檢視DEV所有的系統許可權
SQL> conn /as sysdba Connected. SQL> SELECT * FROM dba_sys_privs dsp WHERE dsp.grantee = upper('&grantee'); Enter value for grantee: dev old 1: SELECT * FROM dba_sys_privs dsp WHERE dsp.grantee = upper('&grantee') new 1: SELECT * FROM dba_sys_privs dsp WHERE dsp.grantee = upper('dev') GRANTEE PRIVILEGE ADM ------------------ ------------------------ --- DEV CREATE ANY VIEW NO DEV DEBUG CONNECT SESSION NO DEV CREATE ANY PROCEDURE NO DEV UNLIMITED TABLESPACE NO DEV DEBUG ANY PROCEDURE NO
建立賬戶DEV_APP
,並授權代理。DEV_APP
通過DEV
代理資料庫連線
SQL> create user dev_app default tablespace dba_data temporary tablespace dba_tmp identified by APP;
User created.
SQL> alter user dev_app grant connect through dev;
User altered.
使用代理使用者連線資料庫
SQL> conn dev[dev_app] --conn proxy_user[real_user]/password_of_proxy_user Enter password: ERROR: ORA-01045: user DEV_APP lacks CREATE SESSION privilege; logon denied Warning: You are no longer connected to ORACLE. SQL> alter create session to dev_app; SP2-0640: Not connected SQL> conn /as sysdba Connected.
DEV_APP需要CREATE SESSION
許可權
SQL> grant create session to dev_app;
Grant succeeded.
檢視當前使用者和代理使用者
SQL> conn dev[dev_app]
Enter password:
Connected.
SQL> select sys_context('userenv','current_user') from dual;
SYS_CONTEXT('USERENV','CURRENT_USER')
------------------------------------------------------------
DEV_APP
SQL> select sys_context('userenv','proxy_user') from dual;
SYS_CONTEXT('USERENV','PROXY_USER')
------------------------------------------------------------
DEV
從這部分測試可用看出,被代理的使用者(即DEV_APP
)通過代理使用者(即DEV
)進行連線時,使用代理使用者的使用者名稱、密碼進行認證,但被代理使用者需要有連線資料庫建立會話的許可權才能連線。
物件訪問許可權
因DEV_APP
通過代理使用者DEV
進行連線,不知DEV_APP
是否也會擁有DEV的許可權。故測試下被代理使用者的許可權是如何處理的。
DEV擁有的表:
SQL> conn dev
Enter password:
Connected.
SQL> select table_name from user_tables;
TABLE_NAME
------------------------------
DBA_TEST
檢視DEV_APP
擁有的表,並訪問DEV
的物件:
SQL> conn dev[dev_app]/
Enter password:
Connected.
SQL> select table_name from user_tables;
no rows selected
SQL> select count(1) from dev.dba_test;
select count(1) from dev.dba_test
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> SELECT * FROM session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
SQL> create table app_test(id number);
create table app_test(id number)
*
ERROR at line 1:
ORA-01031: insufficient privileges
給DEV_APP
使用者授權:
SQL> conn /as sysdba
Connected.
SQL> grant create table to dev_app;
Grant succeeded.
SQL> conn dev[dev_app]
Enter password:
Connected.
SQL> create table app_test(id number);
Table created.
通過這部分測試可用看出,被代理使用者DEV_APP
不會繼承代理使用者DEV
的許可權。要許可權需要額外授予。
小結
One should understand that a database proxied user behaves just like the user itself. The connection is created by the proxy, but the session’s privileges are limited to the privileges of the proxied user, who is after all a database user.
意即被代理使用者(如DEV_APP
)僅僅是通過代理使用者(如DEV
)身份認證並建立資料庫會話連線,在該連線過程中所有的操作都受限於被代理使用者的許可權。
代理認證的作用:
- 多使用者(被代理使用者)可以使用單一使用者(代理使用者)進行認證連線,因統一使用代理使用者的使用者名稱/密碼進行認證,簡化了多使用者的密碼管理。
- 當忘記使用者密碼(如
DEV_APP
),而又想以該身份登陸資料庫時,可以使用代理使用者(如DEV
)。