Exemple : application d'autorisations à un service
Cet exemple montre comment appliquer des autorisations à un service par programmation. Les autorisations constituent un ensemble de règles selon lesquelles des rôles peuvent accéder ou non à un service.
Dans cet exemple, le service est, tout d'abord, rendu privé en refusant l'accès au rôle esriEveryone, un rôle fictif (créé pour les besoins de cet exemple) qui comprend tous les utilisateurs du site. Une seconde règle est ensuite ajoutée afin d'accorder des autorisations d'accès au service de géométrie à un rôle fourni par l'utilisateur. Une fonction supplémentaire est incluse dans le code pour vous expliquer comment rétablir le caractère public du service en accordant à nouveau l'accès au rôle esriEveryone.
Le script tente d'ouvrir une session et d'acquérir le jeton de manière sécurisée à l'aide du protocole HTTPS (connexion chiffrée). Si HTTPS n'a pas été configuré sur votre ArcGIS Server, le script tente, par défaut, d'établir une connexion non sécurisée (pas de chiffrement). Si vous souhaitez exiger une connexion sécurisée, utilisez l'option --secure avec le script.
Le script est écrit dans Python, mais ne nécessite pas l'installation d'un logiciel ESRI. Pour exécuter le script, procédez comme suit :
Sous Windows :
- Enregistrez le contenu dans un fichier nommé setPermissions.py.
- Ouvrez une fenêtre de ligne de commande en utilisant l'option Exécuter en tant qu'administrateur.
- Exécutez setPermission.py, par exemple : setPermissions.py --user admin --password secret --role "GIS Department"
Sous Linux :
- Enregistrez le contenu dans un fichier nommé setPermissions.py.
- Rendez le fichier exécutable (chmod u+x).
- Si Python ne figure pas dans /usr/bin, modifiez la première ligne pour qu'elle pointe vers votre installation de Python (en règle générale, cette opération n'est pas nécessaire).
- Exécutez setPermissions.py, par exemple : ./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 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 Server geometry service."
print
print " --user Publisher/administrator user to log into ArcGIS 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 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:]))