1. 程式人生 > >Proxy Authentication

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)身份認證並建立資料庫會話連線,在該連線過程中所有的操作都受限於被代理使用者的許可權。

代理認證的作用:

  1. 多使用者(被代理使用者)可以使用單一使用者(代理使用者)進行認證連線,因統一使用代理使用者的使用者名稱/密碼進行認證,簡化了多使用者的密碼管理。
  2. 當忘記使用者密碼(如DEV_APP),而又想以該身份登陸資料庫時,可以使用代理使用者(如DEV)。
blog comments powered by Disqus