この例では、プログラムを利用してサービスに権限を適用する方法を説明します。権限は、サービスにアクセスできるロールまたはアクセスできないロールを定義する一連のルールです。
この例では、最初に esriEveryone ロールのアクセスを拒否してサービスをプライベートに設定します。この例で使用する esriEveryone ロールは、サイトのすべてのユーザーを含む架空のロールです。続いて 2 つ目のルールを追加して、ユーザーが指定したロールに、ジオメトリ サービスにアクセスする権限を付与します。コードに追加されている関数は、esriEveryone ロールに再度アクセス権限を付与してサービスをパブリックにする方法を示しています。
スクリプトは HTTPS (暗号化された接続) を使用して、安全なログインとトークンの取得を試みます。ArcGIS Server で HTTPS が構成されていない場合、スクリプトのデフォルトの動作では、セキュリティで保護されていない (暗号化されていない) ログインが試みられます。セキュリティで保護されたログインが必要な場合は、スクリプトに --secure オプションを指定します。
スクリプトは Python で記述されているため、インストールが必要な Esri ソフトウェアはありません。スクリプトを実行するには、以下の手順を実行します。
Windows:
- コンテンツを setPermissions.py という名前のファイルに保存します。
- [管理者として実行] オプションを使用して、コマンド プロンプト ウィンドウを開きます。
- setPermissions.py を実行します。例: setPermissions.py --user admin --password secret --role "GIS Department"
Linux:
- コンテンツを setPermissions.py という名前のファイルに保存します。
- ファイルを実行可能にします (chmod u+x)。
- Python が /usr/bin 以外の場所にある場合は、1 行目を編集して Python のインストール場所を指定します (通常、この手順は必要ありません)。
- setPermissions.py を実行します。例: ./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:]))