`
Virgo_S
  • 浏览: 1153718 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Server JAVA 讲座----用自定义functionality实现用户权限控制

阅读更多
有了上此讲座的基础,我想理解我们这个功能应该就很容易了。刚刚我们经理问我有用户希望控制web登陆用户的权限,那么我们正好利用这个讲座来看看如何实现这个功能。我们新建一个类,functionality当然要实现GISFunctionality接口了:
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-comfficeffice" />
public class SecurityCheckFunctionality implements GISFunctionality {
private AGSMapResource resource;
  public void initFunctionality(GISResource resource) { //empty }
public void destroyFunctionality() { //empty  }
  public GISResource getResource() { //empty  }
}

我们在这里放了一个AGSMapResource类型的变量,因为我们需要对Resource进行很多操作,我们来看一下:
public void initFunctionality(GISResource resource) {
this.resource = (AGSMapResource)resource; //得到资源
    //查看用户是否属于"petroEmployee" 角色
   if(!WebUtil.getExternalContext().isUserInRole("pretroEmployee")){
   //从Resource中得到MapFunctionality
  AGSMapFunctionality mapFunc = (AGSMapFunctionality)resource.getFunctionality("map");

   //得到对 MapServerInfo的引用
   MapServerInfo serverInfo = mapFunc.getMapServerInfo();
   //得到 "Pipeline_Network" 层
MapLayerInfo pipelineLayerInfo = AGSUtil.getLayerInfo("PipeLine_Network",layerInfos);
     if(pipelineLayerInfo==null)
      return; //层不存在,return.
      //从TOC中移除
      MapLayerInfo[] newLayerInfos =  removeLayer(pipelineLayerInfo,layerInfos);
      serverInfo.setMapLayerInfos(newLayerInfos);
      //从MAP中移除
      LayerDescription[] layerDescriptions =serverInfo.getDefaultMapDescription().getLayerDescriptions();
     //新建一个层描述,替换原来的层描述
      LayerDescription[] newLayerDescriptions = new LayerDescription[newLayerInfos.length];

      for(int i=0;i<newLayerInfos.length;i++){
    newLayerDescriptions=AGSUtil.getLayerDescription(newLayerInfos.getLayerID(),layerDescriptions);
5                                                                                    serverInfo.getDefaultMapDescription().setLayerDescriptions(newLayerDescriptions);
    }
  }

上面的代码中用removeLayer(pipelineLayerInfo,layerInfos);函数移除了要移除的层,然后更新了TOC和MAP,我们来看看这个函数怎么来写:
//Logic to remove a layer and all its descendants
  private MapLayerInfo[] removeLayer(MapLayerInfo unwantedLayerInfo, MapLayerInfo[] oldLayerInfos) {
        //新建一个MapLayerInfo
    MapLayerInfo[] newLayerInfos = new MapLayerInfo[oldLayerInfos.length-1];
    ArrayList descendantLayers = new ArrayList();
    for(int i=0,j=0;i<oldLayerInfos.length;i++){
      if(oldLayerInfos.getLayerID()!=unwantedLayerInfo.getLayerID())
        newLayerInfos[j++] = oldLayerInfos;
      if(oldLayerInfos.getParentLayerID()==unwantedLayerInfo.getLayerID())
        descendantLayers.add(oldLayerInfos);
  }
    for(int i=0;i<descendantLayers.size();i++){
newLayerInfos = removeLayer((MapLayerInfo)descendantLayers.get(i),newLayerInfos);
    }
    return newLayerInfos;
  }

我们注意到这是一个递归函数,用于把该层下面所有的其它附属层都删除:

这个functionality写完了,我们来看看如何部署,部署的时候,先把它作为一个Managed Bean部署,用下面可代码即可,可以在faces-config.xml文件里面,也可以在ags-functionality.xml里面:
<managed-bean>
    <managed-bean-name>securitycheck</managed-bean-name>
     <managed-bean-class>com.mypackage.SecurityCheckFunctionality</managed-bean-class>
    <managed-bean-scope>none</managed-bean-scope>
</managed-bean>

将它作为一个managedBean部署后,下面就把它部署到resource中,注意部署的时候,要将其部署到map之后,toc之前,因为ADF初始化是按顺序初始化,我们的权限控制需要从Map中读出层的信息,然后修改MapDesc,从而影响TOC的信息,所以,进行如下的部署配置:
<managed-bean>
    <managed-bean-name>ags1</managed-bean-name>
    <managed-bean-class>
    com.esri.adf.web.ags.data.AGSLocalMapResource
  </managed-bean-class>
   <managed-bean-scope>none</managed-bean-scope>
  ...
  <managed-property>
    <property-name>functionalities</property-name>
    <map-entries>
      <map-entry>
<key>map</key>
<value>#{agsMap}</value>
      </map-entry>
      <map-entry>
<key>query</key>
<value>#{agsQuery}</value>
      </map-entry>
      <map-entry>
<key>tile</key>
<value>#{agsTile}</value>
      </map-entry>
      <map-entry>
<key>overview</key>
<value>#{agsOverview}</value>
      </map-entry>
      <map-entry>
<key>pipeline_security_check</key>
<value>#{securitycheck}</value>
      </map-entry>
      <map-entry>
<key>toc</key>
<value>#{agsToc}</value>
      </map-entry>
    </map-entries>
  </managed-property>
</managed-bean>

OK,这个安全控制的functionality已经完成了。但是我们要对整个WebApplication加上安全控制,需要在web.xml做修改,添加如下的配置:
<login-config>
<auth-method>DIGEST</auth-method>
  <realm-name>My_WebApplication</realm-name>
</login-config>
//声明两个组用户
<security-role>
  <role-name>petroEmployee</role-name>
</security-role>

<security-role>
  <role-name>stateEmployee</role-name>
</security-role>

//声明什么资源将收到安全控制,这里我们把整个目录都控制,当然你也可以控制胆敢目录
<security-constraint>
  <web-resource-collection>
<url-pattern>*<url-pattern>
  </web-resource-collection>
  <auth-constraint>
<role-name>petroEmployee</role-name>
<role-name>stateEmployee<role-name>
</auth-constraint>
</security-constraint>

这两个组在什么地方定义呢?如果是Tomcat,我们可以在$TOMCAT_HOME/conf/tomcat-users.xml中定义,定义如下:
<tomcat-users>  ...
  <user name="joe" password="joe" roles="petroEmployee">
  <user name="daisy" password="daisy" roles="stateEmployee">
  ...
</tomcat-users>

这样我们就控制了整个Web Application,并且对于不同的用户组,赋予了不同的层的查看权限。每次用户访问这个网站的时候,都会被提示要求输入用户名和密码,按照我们在Tomcat-users里面的定义进行输入即可。

还有用户会问道,如果我希望对属性字段的编辑进行控制怎么办;事实上原理是类似的,你让用户修改属性字段时,肯定要传输一个字段列表,你可以根据不同的用户组,对这个字段列表进行控制。

另外,这里我们用了WEB容器的用户和权限进行控制,事实上你不必依赖于Web容器,你可以在数据库中存放你自己定义的用户名和组,进行控制。
权限控制简单的讲就是这样子,.net里面也类似,有机会的话,我会写一个.net版本的给大家看看。

注:本讲座内容参考了并翻译了ESRI的JAVA帮助的部分内容。










分享到:
评论

相关推荐

    ArcGIS+Server+Java讲座

    16、ArcGIS Server Java讲座---用自定义functionality实现用户权限控制 37 17、Server Java讲座-----扩展Tasks框架 42 18、ArcGIS Server Java讲座--自定义Tools开发 48 19、ArcGIS Server Java讲座-空间查询和高亮...

    [feiq]ArcGIS Server Java讲座.doc

    - 讲座讨论了如何通过自定义functionality实现用户权限控制,这是安全性和访问控制的关键部分。 7. **空间查询与网络分析**: - 文档还涉及了空间查询和高亮显示的实现,以及自定义Network Analysis,这些都是...

    javacv-platform-1.3.3-src

    Another option available for Scala users is sbt-javacv. Required Software To use JavaCV, you will first need to download and install the following software: An implementation of Java SE 7 or newer...

    ArcGIS Server java开发文档翻译

    JSP(JavaServer Pages)是创建动态 Web 内容的 Java 技术。文档提供了关于如何在 ArcGIS Server 应用中编写和集成 JSP 页面的指南。 10. **编写自定义任务 (9.Writing a Custom Task)** 自定义任务允许开发者...

    二次开发arcgis_server_for_java

    在本系列讲座中,我们将探讨如何使用 JSF(JavaServer Faces)技术来开发 ArcGIS Server 应用程序。首先,我们需要解释为什么选择了 JSF 而不是其他框架。 **1.1 为什么选择 JSF:** - **成熟度与稳定性:**JSF 是...

    ArcGIS Server Java ADF案例教程

    - **JSF(JavaServer Faces)**:作为ADF的核心技术之一,JSF提供了丰富的UI组件库,简化了Web应用的开发过程。ADF选择了JSF作为其主要的用户界面框架,利用其MVC架构模式,实现了业务逻辑与用户界面的分离,提高了...

    ArcGIS Server Java ADF 案例教程.pdf

    - **ADF选择JSF的原因**:ADF(Application Development Framework)之所以选择JSF(JavaServer Faces)作为其前端技术栈的一部分,主要是因为JSF提供了一套强大的用户界面组件库以及一套易于使用的模型视图控制器...

    PUB00070-Recommended-Functionality-for-EIP-Devices-v10.pdf

    ### 以太网/IP设备推荐功能 - PUB00070-Recommended-Functionality-for-EIP-Devices-v10 #### 1. 引言 本文档旨在为以太网/IP(EtherNet/IP)设备推荐与协议实现相关的功能。这些推荐来源于由以太网/IP实施者圆桌...

    JavaPOS-源码.rar

    在"JavaPOS-源码.rar"这个压缩包中,包含的是JavaPOS的源代码,这对于学习和理解JavaPOS的工作原理以及如何使用JavaPOS API进行开发非常有帮助。下面将详细探讨JavaPOS的一些关键概念和技术: 1. **Device Services...

    ArcGIS Server 9.2帮助文档翻译(7)Adding Custom Functionality

    为了实现这一需求,可以通过实现自定义功能来控制哪些用户可以查看 "Pipeline_Network" 图层。 **三、实现自定义功能的具体步骤** - **创建自定义功能类**:首先,需要创建一个名为 `SecurityCheckFunctionality....

    ARCGIS SERVER9.2_JAVA开发

    《ARCGIS SERVER9.2_JAVA开发》是一本专注于使用Java语言与ArcGIS Server 9.2结合进行地理信息系统开发的专业书籍。该书由许春杰撰写,旨在为开发者提供一套全面的技术指南,帮助他们更好地理解和掌握如何利用ArcGIS...

    章节学习二次开发arcgisserverforjava.pdf

    8. **自定义Functionality和用户权限控制**:介绍了如何通过自定义功能实现用户权限控制,确保应用的安全性。 9. **网络分析**:展示了如何在ArcGIS Server Java中进行网络分析,例如航线查询,这对于物流、交通...

    HTTP-Web-Server:这是符合HTTP1.1的Web服务器的实现

    efficient and standard-based server with free available source code.----------------------- Functionality Covered-----------------------1. GET- On submission of a Get request(downl

    ArcGIS_Server_Java_ADF_案例教程

    首先,教程中提到ADF选择了JSF(JavaServer Faces)作为其基础框架。JSF是一种用于构建Java Web应用程序的标准框架,提供了丰富的用户界面组件,使得开发者能够方便地构建和维护复杂用户界面。ADF采用JSF作为其基础...

    software-raid-functionality

    ### 软件RAID在戴尔服务器中的功能与实现 #### 1. 引言 随着技术的进步,数据存储的需求日益增长,RAID(独立磁盘冗余阵列)技术成为了提高数据可靠性和性能的重要手段之一。戴尔推出的新型PowerEdge T110、R210、...

    Java in easy steps: Covers Java 9, 6th Edition - epub格式

    How to create an Android app, as the core libraries in the Android operating system provide Java functionality. Table of Contents Chapter 1. Getting started Chapter 2. Performing operations Chapter 3....

    ArcGIS Server的项目步骤.ppt

    - 其他格式的数据需转换为ArcGIS兼容格式,可使用ArcToolbox的转换工具或第三方软件如MapInfo通用转换器,甚至编写自定义代码实现。 2. **建立地图文档**: - 加载图层时遵循一定规则,如点线面顺序,业务图层在...

Global site tag (gtag.js) - Google Analytics