例: サービスへの権限の適用

この例では、プログラムを利用してサービスに権限を適用する方法を説明します。権限は、サービスにアクセスできるロールまたはアクセスできないロールを定義する一連のルールです。

この例では、最初に esriEveryone ロールのアクセスを拒否してサービスをプライベートに設定します。この例で使用する esriEveryone ロールは、サイトのすべてのユーザを含む架空のロールです。続いて 2 つ目のルールを追加して、ユーザが指定したロールに、ジオメトリ サービスにアクセスする権限を付与します。コードに追加されている関数は、esriEveryone ロールに再度アクセス権限を付与してサービスをパブリックにする方法を示しています。

スクリプトは HTTPS(暗号化された接続)を使用して、安全なログインとトークンの取得を試みます。ArcGIS Server で HTTPS が構成されていない場合、スクリプトのデフォルトの動作では、セキュリティで保護されていない(暗号化されていない)ログインが試みられます。セキュリティで保護されたログインが必要な場合は、スクリプトに --secure オプションを指定します。

スクリプトは Python で記述されているため、インストールが必要な Esri ソフトウェアはありません。スクリプトを実行するには、以下の手順を実行します。

Windows:

  1. コンテンツを setPermissions.py という名前のファイルに保存します。
  2. [管理者として実行] オプションを使用して、コマンド プロンプト ウィンドウを開きます。
  3. setPermissions.py を実行します。例: setPermissions.py --user admin --password secret --role "GIS Department"

Linux:

  1. コンテンツを setPermissions.py という名前のファイルに保存します。
  2. ファイルを実行可能にします(chmod u+x)。
  3. Python が /usr/bin 以外の場所にある場合は、1 行目を編集して Python のインストール場所を指定します(通常、この手順は必要ありません)。
  4. 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:]))
6/13/2014