DBMS_NETWORK_ACL_ADMIN 包的使用

When you create access control lists for network connections, you should create one access control list dedicated to a group of common users, for example, users who need access to a particular application that resides on a specific host computer. For ease of administration and for good system performance, do not create too many access control lists. Network hosts accessible to the same group of users should share the same access control list.

簡單點說:Oracle允許使用幾個PL/SQL API(UTL_TCP, UTL_SMTP, UTL_MAIL, UTL_HTTP和 UTL_INADDR)訪問外部網絡服務。需要進行權限授權纔可以,比如需要通過oracle發送郵件。

下面是幾個常用的定義acl的相關方法:

1. 創建訪問控制列表
  DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(acl         => 'www.xml',
                                    description => 'WWW ACL',
                                    principal   => 'HR',  -- 賦予權限給哪個用戶
                                    is_grant    => true, -- true表示授予權限 false表示取消權限
                                    privilege   => 'connect');
 
2.   使用ADD_PRIVILEGE存儲過程將其他的用戶或角色添加到訪問控制列表中,它的參數與CREATE_ACL存儲過程的參數類似,
省略了DESCRIPTION參數,同時增加了POSITION參數,它用於設置優先順序。
  DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl       => 'www.xml',
                                       principal => 'HR',
                                       is_grant  => true,
                                       privilege => 'resolve');
                                  
 
3.使用ASSIGN_ACL存儲過程給網絡分配訪問控制列表
  DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl  => 'www.xml',
                                    host => '*.qq.com'); --主機名,域名,ip地址或分配的子網,主機名大小寫敏感,ip地址和域名允許使用通配符  
                                    



4.UNASSIGN_ACL存儲過程允許你手動刪除訪問控制列表,它使用的參數與ASSIGN_ACL存儲過程相同,使用NULL參數作爲通配符。
DBMS_NETWORK_ACL_ADMIN.UNASSIGN_ACL(host => 'www.qq.com');


5.刪除上面的控制列表
DBMS_NETWORK_ACL_ADMIN.drop_acl ( acl => 'www.xml');

6. 查詢創建的ACL信息
SELECT host, lower_port, upper_port, acl,
     DECODE(
         DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE_ACLID(aclid, 'HR', 'connect'),
            1, 'GRANTED', 0, 'DENIED', NULL) privilege

     FROM dba_network_acls


from :http://blog.itpub.net/29196873/viewspace-1068135/


////////////////////實例//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

ORA-24247: 網絡訪問被訪問控制列表 (ACL) 拒絕
ORA-24247: network access denied by access control list (ACL) 

發生這個錯誤是因爲網絡訪問控制列表管理着用戶訪問網絡的權限

========
解決辦法:
========
擁有DBA權限的用戶執行下面的SQL,分3部分

BEGIN
--1.創建訪問控制列表sendmail.xml,sendmail.xml控制列表擁有connect權限,並把這個權限給了B用戶,
  DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(
                       acl=> 'sendmail.xml',                       -- ACL的名字,自己定義    
                       description => 'sendmail ACL',          -- ACL的描述
                       principal   => 'B',                              -- 這裏是用戶名,大寫,表示把這個ACL的權限賦給B用戶
                       is_grant    => true,                            --true:授權 ;false:禁止
                        privilege   => 'connect');                     --授予或者禁止的網絡權限

--2.爲sendmail.xml控制列表添加resolve權限,且賦給B用戶
  DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
                           acl=> 'sendmail.xml',
                                       principal => 'B',
                                       is_grant  => true,
                                       privilege => 'resolve');

--3.爲控制列表ACL sendmail.xml分配可以connect和resolve的host
  DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(
                        acl  => 'sendmail.xml',
                                    host => 'smtp.163.com'); --smtp.163.com是郵箱服務器主機名
END;
/
COMMIT;


再次在用戶B調用A的PROC_SENDMAIL_SIMPLE發郵件過程,成功發送郵件。

from:http://blog.chinaunix.net/uid-23284114-id-3435541.html


另外可以參考:http://blog.chinaunix.net/uid-23284114-id-3435541.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章