Ejemplo: Aplicar permisos para un servicio

Este ejemplo muestra cómo puede aplicar los permisos para un servicio de forma programada. Los permisos son un conjunto de reglas acerca de qué roles pueden o no pueden acceder a un servicio.

En este ejemplo, el servicio se hace primero privado por negar el acceso al papel esriEveryone, un papel ficticio para el propósito de este ejemplo que incluye todos los usuarios del sitio. Luego se agrega una segunda regla para otorgar a un permiso de papel provisto por el usuario para acceder al servicio de geometría. Se incluye una función adicional en el código para mostrar cómo se podría hacer el servicio público mediante la concesión de acceso al papel esriEveryone de nuevo.

La secuencia de comandos intenta iniciar sesión y adquirir el token de forma segura a través de HTTPS (conexión cifrada). Si HTTPS no se ha configurado en su ArcGIS 10.1 for Server, el comportamiento predeterminado es para la secuencia de comandos para intentar un inicio de sesión inseguro (ninguna codificación). Si desea usted para requerir un inicio de sesión seguro y, a continuación, utilice la opción-- segura con la secuencia de comandos.

La secuencia de comandos está escrita en Python, pero no requiere ningún software de Esri para instalarse. Para ejecutar la secuencia de comandos, haga lo siguiente:

[Windows]

  1. Guardar el contenido de un archivo setpermissions.py.

  2. Inicie una ventana de comando de inicio.

  3. Ejecute la setpermission.py. Aquí se ilustra un ejemplo:

    setPermissions.py --user admin --password secret --role "GIS Department"

[Linux]

  1. Guarde el contenido de un archivo setpermissions.py.

  2. Convierta el archivo ejecutable (chmod u+x).

  3. Si Python no existe en /usr/bin, edite la primera línea de punto para la instalación de Python (este paso no suele ser necesario).

  4. Ejecute setpermissions.py. Aquí se ilustra un ejemplo:

    ./setPermissions.py --user admin --password secret --role "GIS Department"

#!/usr/bin/python # Demonstrates how to set permissions on the geometry service.   import httplib, urllib  # used for connecting to ArcGIS 10.1 for Server import re               # used for parsing responses import sys  def main(argv=None):      (user,password, serverName, serverPort, role, secure) = getInputParameters()     token = getToken(user, password, serverName, serverPort, secure)     makeServicePrivate(serverName, serverPort, token, "Geometry", "GeometryServer")     setServicePermission(serverName, serverPort, token, "Geometry", "GeometryServer", role)   def makeServicePublic(serverName, serverPort, token, service, serviceType):     url = "/arcgis/admin/services/" + service + "." + serviceType + "/permissions/add"     params = urllib.urlencode({'principal' : 'esriEveryone', 'isAllowed':'true', 'f' : 'json', 'token' : token})          response = makeHttpPost(serverName, serverPort, url, params)     if (operationSuccessful(response)) :         print "Successfully made " + service + "." + serviceType + " public."     else:         print "Unable to make " + service + "." + serviceType + " public."       def makeServicePrivate(serverName, serverPort, token, service, serviceType):     url = "/arcgis/admin/services/" + service + "." + serviceType + "/permissions/add"     params = urllib.urlencode({'principal' : 'esriEveryone', 'isAllowed':'false', 'f' : 'json', 'token' : token})          response = makeHttpPost(serverName, serverPort, url, params)        if (operationSuccessful(response)) :         print "Successfully made " + service + "." + serviceType + " private."     else:         print "Unable to make " + service + "." + serviceType + " private."    def setServicePermission(serverName, serverPort, token, service, serviceType, role):     url = "/arcgis/admin/services/" + service + "." + serviceType + "/permissions/add"     params = urllib.urlencode({'principal' : role, 'isAllowed':'true', 'f' : 'json', 'token' : token})          response = makeHttpPost(serverName, serverPort, url, params)     if (operationSuccessful(response)) :         print "Successfully granted " + role + " permission to " + service + "." + serviceType     else:         print "Unable to grant " + role + " permission to " + service + "." + serviceType   def operationSuccessful(response):     statusPattern = re.compile('[\w]+')     statusValue = statusPattern.findall(response)[1]      if (statusValue == "success"):         return 1     else:         return 0  def getToken(username, password, serverName, serverPort, secure):     tokenURL = "/arcgis/admin/generateToken"         params = urllib.urlencode({'username': username, 'password': password, 'client': 'requestip', 'f': 'json'})           response = makeHttpPost(serverName, serverPort, tokenURL, params, secure)     if (response == None):         print "ERROR: Unable to login.  The following may have caused this:"         print          print "    1) Incorrect username or password."         print "    2) Incorrect server name or port."         if (secure):             print "    3) The server may not have https enabled."         print         print         sys.exit()     tokenPattern = re.compile('[\w-]+')     tokenMatch = tokenPattern.findall(response)[1]     return tokenMatch                     def makeHttpPost(serverName, serverPort, url, params, secure=0):            headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}     if (serverPort == 80) :         securePort = 443     else:         securePort = 6443          try:         httpsFailed = 0         httpsConn = httplib.HTTPSConnection(serverName, securePort)         httpsConn.request("POST", url, params, headers)                response = httpsConn.getresponse()         if (response.status == 200):             data = response.read()             httpsConn.close()             return data         else:             httpsFailed = 1     except:         httpsFailed = 1      if (httpsFailed and secure):         return          try:         httpConn = httplib.HTTPConnection(serverName, serverPort)         httpConn.request("POST", url, params, headers)            response = httpConn.getresponse()         if (response.status == 200):             data = response.read()             httpConn.close()             return data                     else:             httpConn.close()             return      except:         return         def getInputParameters() :     if (len(sys.argv)  == 1):            print "Sets a role's permission for ArcGIS 10.1 for Server geometry service."            print             print "     --user       Publisher/administrator user to log into ArcGIS 10.1 for Server with."            print "     --password   Password for publisher/administrator login"            print "     --server     Server machine.  Optional, default is localhost."            print "     --port       Port to use when connecting.  Option, default 6080."            print "     --role       ArcGIS 10.1 for Server role being affected."            print "     --secure     Requires a secure login."            print            sys.exit()     user = None     password = None     role = None     serverName = "localhost"     serverPort = 6080          secure = 0          for i in range(1, len(sys.argv)) :         if (sys.argv[i] == "--user" and i < len(sys.argv)-1):             user = sys.argv[i+1]                     elif (sys.argv[i] == "--password" and i < len(sys.argv)-1) :             password = sys.argv[i+1]         elif (sys.argv[i] == "--server" and i < len(sys.argv)-1) :             serverName = sys.argv[i+1]         elif (sys.argv[i] == "--port" and i < len(sys.argv)-1) :             port = sys.argv[i+1]         elif (sys.argv[i] == "--role" and i < len(sys.argv)-1):             role = sys.argv[i+1]         elif (sys.argv[i] == "--secure"):             secure = 1         if (user == None or password == None or role == None) :         if (user == None):             print "The --user parameter was not provided."         elif (password == None):             print "The --password parameter was not provided."         elif (role == None):             print "The --role parameter was not provided."         sys.exit()     else:         return (user,password, serverName, serverPort, role, secure)               # Script start if __name__ == "__main__":     sys.exit(main(sys.argv[1:]))
9/11/2013