你好,游客 登录
背景:
阅读新闻

ArcGIS权限分析-怎么对同一要素类对不同要素设置权限(更新版) - ArcGIS技术研究

[日期:2013-04-02] 来源:  作者: [字体: ]

今天又接到用户来咨询怎么对同一要素类对不同要素设置权限的问题,看来这个需求大家都是非常迫切。


重新解释一下用户的要求,比如说我有一个整个北京市宗地的要素类,所有地区的要素类都在一起,但是有一个要求,用户只想在一个要素类里面进行操作,而且朝阳区国土局的工作人员只能编辑所属朝阳区的数据,海淀区国土局工作人员只能编辑所属海淀区的宗地,其实也就是一个同一要素类对不同要素设置权限的问题。


之所以有这个需求,大家都是所有数据在同一个要素类,而不是分区域要素类,那么对一个要素类的不同要素权限就显得需求迫切了。

在以前我也写过类似的文章,但是那些方法还是有不足之处,不是特别符合要求:http://blog.csdn.net/linghe301/article/details/7053965


今天在Esri中国论坛看到了一个帖子,启发很大,借助于他的建议,自己做了相关实验,还是可以满足相关需求的。

这里感谢@GAT5的分享精神:http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=125974&page=1&extra=#pid1067570

他的帖子细节写的不多,下面我就对我的这次测试,以及在测试中遇到的问题跟大家做分享。


预前知识:VPD
概述
虚拟专用数据库 (VPD) 提供了角色和视图无法提供的行级访问控制。对于互联网访问,虚拟专用数据库可以确保在线银行的客户只能看到他们自己的帐户。Web 托管公司可以在同一 Oracle 数据库中维护多个公司的数据,但只允许每个公司查看其自身数据。


在企业内部,虚拟数据库可在应用程序部署方面降低拥有成本。可以在数据库服务器一次实现安全性,而不用在访问数据的每个应用程序中分别实现安全性。因为是在数据库中实施安全性,所以不管用户访问数据的方式如何,安全性较以前更高。访问即席查询工具或新报表生成程序的用户不再能绕过安全环节。虚拟专用数据库是一项重要技术,使企业能够构建托管的、基于 Web 的应用程序。实际上,许多 Oracle 应用程序本身使用 VPD 实施数据分隔,包括 Oracle SalesOnline.com 和 Oracle Portal 等程序。

虚拟专用数据库如何工作
将一个或多个安全策略与表或视图关联后,就可以实现虚拟专用数据库。对带安全策略的表进行直接或间接访问时,数据库将调用一个实施该策略的函数。策略函数返回一个访问条件(WHERE 子句),即谓词。应用程序将它附加到用户的 SQL 语句,从而动态修改用户的数据访问权限。

你可以通过编写一个存储过程将 SQL 谓词附加到每个 SQL 语句(用于控制该语句的行级别访问权限)来实施 VPD。例如,如果 John Doe(他属于 Department 10)输入 SELECT * FROM emp 语句,则可以使用 VPD 添加 WHERE DEPT = 10 子句。这样,您便可以通过对查询进行修改来限制访问某些行的数据。

虚拟专用数据库确保无论用户以何种方式访问数据(通过应用程序、报表编写工具或 SQL*Plus),都将强制实施同一强大的访问权限控制策略。这样,使用 VPD ,银行便可以确保客户只看到他们自己的帐户,电信公司可以安全地隔离客户记录,人力资源应用程序可以支持复杂的员工记录数据访问原则。

其实总结起来一句话,我们可以设置完毕之后,查询或者编辑过程中自动添加一个WHERE条件。


实验数据:

用户:SDE,我在SDE用户创建一个要素类test123,里面有一个X字段(整型)

SQL> desc sde.test123
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 OBJECTID                                  NOT NULL NUMBER(38)
 QUXIAN                                             NVARCHAR2(50)
 SHAPE                                              ST_GEOMETRY
 X                                                  NUMBER(5)

用户:DDD,普通用户

-- Create the user 
create user DDD
  identified by ""
  default tablespace SDE
  temporary tablespace TEMP
  profile DEFAULT
  password expire;
-- Grant/Revoke object privileges 
grant select, insert, update, delete on A69 to DDD;
grant select, insert, update, delete on D69 to DDD;
grant select, insert, update, delete on TEST123 to DDD;
grant select, insert, update, delete on TEST123_VW to DDD;
-- Grant/Revoke role privileges 
grant connect to DDD;
grant resource to DDD;
-- Grant/Revoke system privileges 
grant unlimited tablespace to DDD;
我使用ArcGIS的权限功能,将SDE用户的test123要素类给DDD赋予SELECT、INSERT、UPDATE、DELETE权限。

那么我使用DDD用户就可以看到sde用户下的test123的所有数据。

那么我的需求就是,我只想让DDD用户看到test123要素类中X=2的要素。


VPD包含两个要素:策略(policy),策略函数(policy Function)

编写策略函数(fn_reg)

CREATE OR REPLACE  FUNCTION fn_reg (p_owner in varchar2, p_object in varchar2) return varchar2 IS
v_region varchar2(20);
begin
v_region := sys_context('USERENV','SESSION_USER');--获得登录用户
if v_region = 'DDD' then ---如果登录用户是DDD
return  'X=2';   ---相关WHERE条件就是X=2
else
return null;
end if;
end fn_reg;

如果用户比较多,可以将这个用户放在一个表中,或者参考上面的链接,好像编写策略函数不支持else if

一般情况下通过完善策略函数来对用户的业务进行定义



策略(policy)用户管理(添加、删除、修改)对那些对象(表或视图)执行RLS(行级安全)控制。

添加策略

begin
dbms_rls.add_policy(object_schema => 'sde',object_name => 'test123',policy_name => 'pol',function_schema => 'sde',policy_function => 'fn_reg',Statement_Types =>'Select,Insert,Update,Delete,Index',Enable =>True);
end;
/


begin
dbms_rls.add_policy(object_schema => 'sde',object_name => 'a69',policy_name => 'pol_a',function_schema => 'sde',policy_function => 'fn_reg',Statement_Types =>'Select,Insert,Update,Delete,Index',Enable =>True);
end;
/

添加策略的相关属性

  • OBJECT_NAME:表名、视图名或同义词  
  • OBJECT_SCHEMA:用户名  
  • POLICY_NAME:策略名称  
  • POLICY_FUNCTION:需要使用的策略函数
  • FUNCTION_SCHEMA:策略函数所属用户
  • STATEMENT_TYPE:应用策略的DML,可以是SELECT,INSERT,UPDATE,DELETE的任意组合  UPDATE_CHECK:在INSERT和UPDATE的时候是否检查。  
  • ENABLE:是否启用策略  
  • STATIC_POLICY: 默认为FALSE,设置为TRUE时,该策略为任何访问该对象的人产生相同的谓词字符串。  
  • POLICY_TYPE: 默认为STATIC,允许的值是STATIC、SHARED_STATIC、CONTEXT_SENSITIVE、SHARED_CONTEXT_SENSITIVE和DYNAMIC。  
  • LONG_PREDICATE:该参数默认为FALSE。如果它为TRUE,谓词字符串最多可为32K字节长。否则,限制为4000字节  
  • SEC_RELEVENT_COL:10G新增,设置受保护的列,被设置的列的数据将不会显示,只能应用与表和视图,使用逗号或空格作为分隔符。假如DML语句中不含有设置的列,则忽略此策略。  
  • SEC_RELEVANT_COLS_OPT:10G新增,允许在列级别VPD过滤查询中的行仍然出现在结果集中,敏感列返回NULL值。指定DBMS_RLS.ALL_ROWS显示所有列
注意:上面为什么还有对a69表进行添加策略,如果用户将test123注册版本了,那么会产生相关的A表。

删除策略
BEGIN
   DBMS_RLS.drop_policy (object_schema   => 'SDE',
                         object_name     => 'test123',
                         policy_name     => 'POL');
END;
/

添加之后,我们需要查看一下是否有效
1:可以使用PL/SQL进入sde用户下查看Function的fn_reg是否编译正确
2:查看V$VPD_POLICY特别注意PREDICATE是有相关的条件信息比如X=2
SQL> select object_owner,object_name,policy,predicate from V$VPD_POLICY;

OBJECT_OWNER                   OBJECT_NAME                    POLICY                         PREDICATE
------------------------------ ------------------------------ ------------------------------ -------------------------------------------------------------
SDE                            TEST123                        POL                            
SDE                            TEST123                        POL                            X=2
SDE                            TEST123                        POL                            X=2
SDE                            T                              POLICY_LIMITED_QUERY_T         X <= 10000
SDE                            TEST123                        POL                            
SDE                            A69                            POL_A                          X=2
SDE                            A69                            POL_A                          X=2

那么进行测试,我使用sde用户登录之后

那么我使用ddd用户登录之后

我们可以使用ddd用户只过滤x=2的要素。
那么我们在ArcMap上连接ddd用户对test123进行编辑,一开始老报ORA-28115: 策略违反检验选项。
倒腾半天,忽然开窍,我设置的策略是过滤X=2,那么我新建要素并没有设置X=2,所以报ora-28115错误。
刚好,我可以使用ddd用户连接,设置一个编辑模板,这个编辑模板设置x=2即可。


通过上面的测试,我们就可以模拟,在同一个要素类对不同的要素进行权限的设置,而且可以进行相关的读和写的操作。
由于上面使用的都是纯Oracle知识,还不确定是否在应用在ArcSDE里面有没有相关的Bug或者问题,这个有待大家一块交流和分享。





收藏 推荐 打印 | 录入:admin | 阅读:
相关新闻