Beispiel: Anwenden von Berechtigungen auf einen Service
In diesem Thema
In diesem Beispiel wird gezeigt, wie Sie Berechtigungen programmgesteuert auf einen Service anwenden können. Berechtigungen sind eine Gruppe von Regeln, die bestimmen, welche Rollen auf einen Service zugreifen können.
In diesem Beispiel wird der Service zunächst zu einem privaten Service, indem der Rolle "esriEveryone" der Zugriff verweigert wird. Dies ist eine fiktive Rolle, die alle Benutzer der Site enthält. Dann wird eine zweite Regel angewendet, mit der vom Benutzer angegebene Rollenberechtigungen zugewiesen werden, um einen Zugriff auf den Geometrie-Service zu ermöglichen. Um zu zeigen, wie der Service wieder öffentlich gemacht wird, ist im Code ist noch eine zusätzliche Funktion enthalten, mit der der Rolle "esriEveryone" wieder Zugriff gewährt wird.
Die Anmeldung des Skripts und das Abrufen des Tokens erfolgt über eine sichere, verschlüsselte HTTPS-Verbindung. Wenn HTTPS nicht auf Ihrem ArcGIS for Server konfiguriert wurde, meldet sich das Skript über eine nicht verschlüsselte Verbindung an. Wenn Sie eine sichere Anmeldung wünschen, sollten Sie die Option "--secure" im Skript verwenden.
Das Skript ist in Python geschrieben, erfordert aber keine Installation von Esri Software. Gehen Sie wie folgt vor, um das Skript auszuführen:
Unter Windows:
- Speichern Sie den Inhalt in der Datei setPermissions.py.
- Öffnen Sie mithilfe der Option Als Administrator ausführen ein Eingabeaufforderungsfenster.
- Führen Sie zum Beispiel setPermissions.py aus: setPermissions.py --user admin --password secret --role "GIS-Abteilung"
Unter Linux:
- Speichern Sie den Inhalt in der Datei setPermissions.py.
- Machen Sie die Datei zu einer ausführbaren Datei (chmod u+x).
- Wenn Python nicht in /usr/bin vorhanden ist, müssen Sie die erste Zeile so bearbeiten, dass sie auf die Python-Installation verweist (dieser Schritt ist in der Regel nicht erforderlich).
- Führen Sie zum Beispiel setPermissions.py aus: ./setPermissions.py --user admin --password secret --role "GIS-Abteilung"
#!/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:]))