您现在的位置: 万盛学电脑网 >> 程序编程 >> 数据库 >> oracle教程 >> 正文

oracle11g之ACL拙见

作者:佚名    责任编辑:admin    更新时间:2022-06-22

   错误样例(使用UTL_HTTP发送http请求时,报出如下错误):

  原因:

  1、Oracle允许使用几个PL/SQL API(UTL_TCP, UTL_SMTP, UTL_MAIL, UTL_HTTP和 UTL_INADDR)访问外部网络服务,这些API都使用TCP协议。

  2、在Oracle 10g是通过一个基于用户是否被授予执行某个包的许可的 on/off开关来实现的,Oracle 11g引入了细粒度访问网络服务.

  3、通过在XML DB 数据库中使用访问控制列表(ACL)来实现,允许控制哪个用户能够访问哪个网络资源,而不关心包的授权。

  解决办法:

  -- 查询网络访问控制列表 acl

?

1 Select * From  dba_network_acls

  -- 查询访问控制权限列表

?

1 Select * From  dba_network_acl_privileges

  -- 查询数据库中的用户,用户名大小写敏感

?

1 Select username From dba_users Where username Like '%ITS%'

  分配acl权限,执行如下sql语句:

?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 begin   dbms_network_acl_admin.create_acl (       -- 创建访问控制文件(ACL)     acl         => 'utl_http.xml',          -- 文件名称     description => 'HTTP Access',           -- 描述     principal   => 'ITS',                   -- 授权或者取消授权账号,大小写敏感     is_grant    => TRUE,                    -- 授权还是取消授权     privilege   => 'connect',               -- 授权或者取消授权的权限列表     start_date  => null,                    -- 起始日期     end_date    => null                     -- 结束日期   );     dbms_network_acl_admin.add_privilege (    -- 添加访问权限列表项     acl        => 'utl_http.xml',           -- 刚才创建的acl名称     principal  => 'ITS',                    -- 授权或取消授权用户     is_grant   => TRUE,                     -- 与上同     privilege  => 'resolve',                -- 权限列表     start_date => null,                         end_date   => null   );     dbms_network_acl_admin.assign_acl (       -- 该段命令意思是允许访问acl名为utl_http.xml下授权的用户,使用oracle网络访问包,所允许访问的目的主机,及其端口范围。     acl        => 'utl_http.xml',     host       => '100.1.2.1',              -- ip地址或者域名,填写http://localhost:9000/hello与http://localhost:9000/是会报host无效的                                             -- 且建议使用ip地址或者使用域名,若用localhost,当oracle不是安装在本机上的情况下,会出现问题     lower_port => 9000,                     -- 允许访问的起始端口号     upper_port => Null                      -- 允许访问的截止端口号   );   commit; end;   begin   dbms_network_acl_admin.assign_acl (       -- 可以授权多个主机,或者多个主机的多个端口     acl        => 'utl_http.xml',     host       => '10.100.49.138',     lower_port => 80,     upper_port => NUll   );   commit; end;   请求测试:

?

1 select utl_http.request('http://localhost:9000/hello?wsdl') From dual;

  若出现no listener,是因为授权主机时不能写localhost,应该写ip地址或者域名,如下图:

  移除acl和权限控制

  撤销分配acl到hostacl -- 与assign对应

?

1 2 3 4 5 6 7 8 9 10 11 12 begin   dbms_network_acl_admin.unassign_acl(       acl        => 'utl_http.xml',     host       => '100.1.2.1',                               &