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]
Guardar el contenido de un archivo setpermissions.py.
Inicie una ventana de comando de inicio.
Ejecute la setpermission.py. Aquí se ilustra un ejemplo:
setPermissions.py --user admin --password secret --role "GIS Department"
[Linux]
Guarde el contenido de un archivo setpermissions.py.
Convierta el archivo ejecutable (chmod u+x).
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).
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:]))