這篇文章主要講解應用程序客戶端訪問數據庫的新特性
有些地方理解不好
寫得也不是很好
請大家幫忙指正
謝謝!
I安全認證擁有
解決了阻止未經認證的用戶通過其他客戶端訪問數據的問題
在隱藏密碼的實現方面有了比以前更好的機制
角色的有效性是通過一個包來檢測而不是一個口令
……應用設置的概念在
i中已經作了介紹
i中細粒度訪問控制能夠達到制作有效的私有數據庫
而在
i中應用設置已經可以用一個角色來實現
因此提高了私有數據庫的可用性
為了確認一個角色是否有效
必須調用關聯的存儲過程
這個存儲過程可以通過使用sys_context(
userenv
nnn)來制定一系列的額外檢查
nnn可以是ip_address
proxy_account等
(舉例
我們可以在存儲過程和觸發器裡調用select sys_context(
userenv
ip_address) from dual得到客戶端的ip
然後根據這個資料進行判斷
sys_context的具體用法如下
select
SYS_CONTEXT(
USERENV
TERMINAL
) terminal
SYS_CONTEXT(
USERENV
LANGUAGE
) language
SYS_CONTEXT(
USERENV
SESSIONID
) sessionid
SYS_CONTEXT(
USERENV
INSTANCE
) instance
SYS_CONTEXT(
USERENV
ENTRYID
) entryid
SYS_CONTEXT(
USERENV
ISDBA
) isdba
SYS_CONTEXT(
USERENV
NLS_TERRITORY
) nls_territory
SYS_CONTEXT(
USERENV
NLS_CURRENCY
) nls_currency
SYS_CONTEXT(
USERENV
NLS_CALENDAR
) nls_calendar
SYS_CONTEXT(
USERENV
NLS_DATE_FORMAT
) nls_date_format
SYS_CONTEXT(
USERENV
NLS_DATE_LANGUAGE
) nls_date_language
SYS_CONTEXT(
USERENV
NLS_SORT
) nls_sort
SYS_CONTEXT(
USERENV
CURRENT_USER
) current_user
SYS_CONTEXT(
USERENV
CURRENT_USERID
) current_userid
SYS_CONTEXT(
USERENV
SESSION_USER
) session_user
SYS_CONTEXT(
USERENV
SESSION_USERID
) session_userid
SYS_CONTEXT(
USERENV
PROXY_USER
) proxy_user
SYS_CONTEXT(
USERENV
PROXY_USERID
) proxy_userid
SYS_CONTEXT(
USERENV
DB_DOMAIN
) db_domain
SYS_CONTEXT(
USERENV
DB_NAME
) db_name
SYS_CONTEXT(
USERENV
HOST
) host
SYS_CONTEXT(
USERENV
OS_USER
) os_user
SYS_CONTEXT(
USERENV
EXTERNAL_NAME
) external_name
SYS_CONTEXT(
USERENV
IP_ADDRESS
) ip_address
SYS_CONTEXT(
USERENV
NETWORK_PROTOCOL
) network_protocol
SYS_CONTEXT(
USERENV
BG_JOB_ID
) bg_job_id
SYS_CONTEXT(
USERENV
FG_JOB_ID
) fg_job_id
SYS_CONTEXT(
USERENV
AUTHENTICATION_TYPE
) authentication_type
SYS_CONTEXT(
USERENV
AUTHENTICATION_DATA
) authentication_data
from dual
i以前的版本
認證角色是通過password的方法
將用戶名
口令寫入應用程序來進行連接
這樣的缺點是
如果口令在客戶端被解析出來
任何應用程序都能夠訪問你的數據
下面我們看一個
i認證角色的例子
CREATE ROLE salesuser
IDENTIFIED USING sh
sales_chk;
CREATE OR REPLACE PROCEDURE sales_chk
AUTHID CURRENT_USER IS
ipchk STRING(
);
BEGIN /* Only certain IP addresses allowed */
SELECT SYS_CONTEXT(
USERENV
IP_ADDRESS
)
INTO ipchk FROM DUAL;
IF SUBSTR(ipchk
) !=
THEN RETURN; END IF; /* Fail silently */
DBMS_SESSION
SET_ROLE(
SALESUSER
); /* Enable */
END;
/
這個過程做到
如果不在
網段
這個角色失效
全局應用設置
一個設置現在能夠被全局化和共享
全局化應用設置就是:
比每個進程一個設置更節省資源
利用有效私有數據庫能夠更好的適應基於web的應用
仍然可以通過identifier驗證訪問權限
更適應多路連接
oracle
i的有效私有數據庫特性提供了連接池以允許多重會話使用一個或多個全局應用設置
而不需要為每個用戶建立一個應用設置
全局應用設置為基於web的應用提供了額外的靈活的設置
在多重會話中重復利用普通應用設置大大提高了性能
在ebusiness應用中
應用用戶代理認證可以使用公用應用設置來提高適應性和性能
通過公用應用設置的一次設立代替為每個會話獨立設置初始化應用設置這種方式進行會話級重用提高了性能
為了決定當前會話的運行環境以符合細粒度訪問控制
中間件必須為每一個應用設定應用設置
全局設置允許中間件把各種應用設置存儲在實例裡並且在會話建立時為一個用戶會話指派設置
這個設置也就成為了會話的運行設置
這將大大減小用戶會話在應用連接池環境中的建立時間
管理全局應用設置
一些接口已經被加到dbms_session包裡來管理客戶端會話的應用設置
包括
set_context
clear_context
set_identifier
clear_identifier
為了支持通過中間件應用管理的會話連接池
對於dbms_session接口的管理應用設置也為每一個應用設置增加了一個客戶端認證
在這種方式下
我們可以全局管理應用設置而客戶端僅僅看到為他們設置的應用設置
中間件應用器服務能夠使用set_context來為一個制定的客戶id設置應用設置
那麼
當分配數據庫連接來處理客戶端需求
應用服務器需要執行set_identifier來表示這個應用會話的id
那麼
每次客戶端調用sys_context
僅僅被指派給這個驗證用戶的設置被返回
全局應用設置函數
(舉例)
管理員通過以下指令建立全局設置
SQL> CREATE CONTEXT webhr USING hr
init ACCESSED GLOBALLY;
應用服務器啟動將為HR用戶建立多重連接
當用戶JOHN連接到應用服務器後
JOHN不是一個數據庫用戶
應用服務器將在應用裡鑒別JOHN
並且為這個連接
設置一個臨時的會話ID
基於唯一應用會話屬性
這個會話ID作為COOKIE或者應用服務器的維護的一部分返回用戶JOHN的浏覽器
應用服務器為這個客戶端初始應用設置稱為HR
INIT包
它執行
DBMS_SESSION
SET_CONTEXT(
webhr
id
JOHN
HR
);
DBMS_SESSION
SET_CONTEXT(
webhr
dep
sales
HR
);
例子
CREATE CONTEXT webhr USING hr
init ACCESSED GLOBALLY;
DBMS_SESSION
SET_CONTEXT(
webhr
id
JOHN
HR
);
DBMS_SESSION
SET_IDENTIFIER(
);
…
SYS_CONTEXT calls are in John
s context
…
DBMS_SESSION
CLEAR_IDENTIFIER(
);
當用戶JOHN用應用服務器訪問數據
應用服務器找到所有登陸的會話
並執行DBMS_SESSION
SET_IDENTIFIER(
)
所有的這個會話的SYS_CONTEXT將只返回屬於這個客戶端的應用程序設置
例如SYS_CONTEXT(
WEBHR
ID
) 將只返回
JOHN
最後注意
如果數據訪問是通過有效私有數據庫來管理的
建立設置並不能自動限制數據訪問
From:http://tw.wingwit.com/Article/program/Oracle/201311/18800.html