ArcGIS Server 安全性与 Oracle 数据库相集成
前几天在网上有人咨询一个问题:假设我有两个图层,一个线图层,一个面图层,保存成MXD,然后发布服务,我想用户不同的用户来访问相关的图层,实现在Server中权限的设置。其实这种情况也比较常见,特别是在一个服务下,可能对不同的访问用户设置相关的权限,
前几天在网上有人咨询一个问题:假设我有两个图层,一个线图层,一个面图层,保存成MXD,然后发布服务,我想用户不同的用户来访问相关的图层,实现在Server中权限的设置。其实这种情况也比较常见,特别是在一个服务下,可能对不同的访问用户设置相关的权限,在实际应用中也是很有适用性的。
当然,ArcGIS Server 10版本可以支持上面说的这种情况。
目前该功能只能支持Oracle数据库
测试环境:ArcGIS Desktop10.1、ArcSDE10.1、ArcGIS Server10.1 、Oracle11.2.0.1
测试说明:
默认数据库在sde用户下存储
SDE.XZQJX_G_410404:线状要素类——web用户名为:lineuser只能访问该图层
SDE.DLTB_G_410404:面状要素类——web用户名为:polyuser只能访问该图层
当用户请求使用某一 Oracle 数据库中数据的 GIS 资源时,ArcGIS Server 可将用户的标识向下传递到数据库,从而能够强制进行基于用户标识的访问控制。此功能目前不适用于其他数据库系统。
使用数据库级别的安全性时,除了或代替 ArcGIS Server Web 服务的权限,可对用户授予对数据库中的表格(和/或列和行)的权限。按照下面的说明进行操作以配置 Oracle 数据库的集成安全性。
- 为地图作者创建一个数据库帐户。
因为我的数据库已经有一个SDE用户,我的数据也放在SDE用户了,所以我就不用创建新用户了,不过也可以创建一个新的数据库用户,将测试数据导入到该用户下也可以。
- 为 ArcGIS Web 服务用户创建一个数据库帐户。
我已经拥有一个Server的超级用户arcgis,两个普通的web用户,lineuser、polyuser,所以我需要在数据库创建与Web用户相同名称相同密码的两个数据库账户。
--创建与Web同名同密码的数据库账户 CREATE USER创建完用户,然后创建数据库角色,然后设置针对每个用户对应的角色,在设置角色的语句我们可以设置用户具体对那些图层具体有相关的权限IDENTIFIED by DEFAULT TABLESPACE TEMPORARY TABLESPACE ; --赋予该数据库帐号权限 GRANT CONNECT,RESOURCE to ; --将新建数据库的用户设为源数据库用户的代理用户 ALTER USER GRANT CONNECT THROUGH
--创建一个linerole对象 CREATE ROLE linerole NOT IDENTIFIED; --该linerole角色就是可以“读取”SDE用户下的要素类名称为:XZQJX_G_410404 GRANT SELECT ON SDE.XZQJX_G_410404 TO linerole; --将该角色赋予lineuser用户 GRANT linerole to lineuser; CREATE ROLE polyrole NOT IDENTIFIED; --该polyrole角色就是可以“读写”SDE用户下的要素类名称为:DLTB_G_410404 GRANT SELECT,UPDATE,INSERT,DELETE ON SDE.DLTB_G_410404 TO polyrole; GRANT polyrole to polyuser;另外,也可以对要素类的行和列设置权限。
说明:帮助上说可以对行和列设置权限:相关参考:http://blog.csdn.net/linghe301/article/details/8751879
如果我非要对要素类的行和列设置权限怎么实现?
很简单,建立相关的视图即可。变相的将对行和列的权限设置为不同的视图来存储,这就转变成上面增加相关的视图图层了。
参考:sdetable -o create_view
- 制作一个文档并将其发布到 ArcGIS Server。
将两个图层保存为一个MXD,然后发布服务即可。
- 启用数据库集成安全性。
打开ArcGIS Manger,设置用户、角色、权限等。将Web用户与角色关联一下
在测试服务对象中设置安全,在服务右边有个小锁,点击编辑权限
- 打开 ArcGIS Server 管理员目录 (http://myserver:6080/arcgis/admin) 并以主站点管理员身份或具有管理访问权限的用户身份登录。
- 单击系统 > 属性 > 更新。
- 在属性文本框中,输入下面的 JSON 代码:
{"pushIdentityToDatabase" : "true" }
- 单击更新保存更改。
- 测试集成安全性。
在测试阶段我费了很大周折,可能是对ArcGIS Server用的不是很多,也学到了很多东西。
1:直接在ArcGIS Desktop创建不同用户的(Use GIS Services)
问题:我直接将某个用户下面的服务拖拽在ArcMap上看,会长时间未响应,然后报如下错误
这个不知道跟我的环境是否有关。
2:我在ArcGIS manger里面测试,也是利用不同的用户登录。
问题:如果我清空Chome缓存信息,以不同用户登录可以查看不同的图层,但是如果我再次登录,就会直接访问缓存中保存的登录和数据信息,每次清空缓存才能验证。
3:利用REST登录(推荐)
http://服务器IP:6080/arcgis/rest/services/服务名称/MapServer
直接在REST预览即可
那么还有一个问题,我是否可以使用ArcGIS Server的超级用户(arcgis)来查看这个服务(看两个图层)?
如果有这个需求,那么就需要用户在再数据库创建一个arcgis名字的数据库用户,然后设置相关角色才可以。
什么时候可以用?
比如以北京市地图为例,可以发布了针对整个北京市的地图服务,但是上级领导希望海淀区的用户只能浏览海淀的数据,朝阳的用户只能浏览朝阳的数据
1:创建针对海淀区和朝阳区的服务,这样就增加了服务数,但是也对服务器资源消耗更加多了
2:利用上面的方式,可以创建海淀或者朝阳的数据视图,然后还保存在一个服务里面,然后根据权限来访问不同的图层。
-------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------