В этом примере используется текстовый файл с данными пользователей, которые добавляются на портал в пакетном режиме. Выбор и предоставление ролей для каждого пользователя портала.
При запуске скрипта введите следующую обязательную информацию:
- Путь к текстовому файлу с данными пользователей, например, /home/admin/documents/users.txt.
- Типы добавляемых на портал пользователей, например, built-in или enterprise. Более подробно о типах пользователей см. в Управление доступом на портал.
- Полное доменное имя компьютера с порталом, например, myportal.acme.com. Скрипт обращается к порталу по HTTPS через порт 7443 в обход ArcGIS Web Adaptor. Таким образом, скрипту не потребуется обрабатывать аутентификацию на веб-уровне, если портал настроен на ее использование.
- Имя пользователя и пароль для учетной записи, которая имеет права администратора портала. Если вы добавляете встроенные учетные записи, укажите учетные данные любого участника портала с правами доступа администратора. Если вы добавляете корпоративные учетные записи, используйте первичную учетную запись администратора, созданную после установки Portal for ArcGIS.
Примечание:
Демонстрация обработки аутентификации на веб-уровне скриптом Python не входит в круг вопросов, освещаемых этим примером.
Регистрация корпоративных учетных записей
При регистрации корпоративных учетных записей используется следующий формат каждой строки:
<login>|<email address>|<name>|<role>|<description>|<Idp UserName>
login – Логин – регистрируемая корпоративная учетная запись.
- Если вы используете Active Directory, это имя учетной записи будет иметь формат sAMAccountName@DOMAIN. Имя домена должно быть полностью в верхнем регистре.
- Если вы используете LDAP, это имя учетной записи будет совпадать со значением userNameAttribute, которое вы указали при настройке хранилища учетных данных (аутентификации).
- Если вы используете корпоративные учетные записи на основе SAML, то имя этой учетной записи будет совпадать с атрибутом NameID провайдера аутентификации SAML.
email address – адрес электронной почты, связанный с учетной записью и совпадающий со значением в хранилище аутентификаций. Если учетная запись пользователя не имеет адреса электронной почты, укажите вымышленное или общее значение.
name – псевдоним учетной записи, который будет использоваться в вашей организации ArcGIS. В большинстве хранилищ учетных данных в качестве псевдонима по умолчанию используется полное имя пользователя. Когда пользователь подключается к веб-сайту портала, это имя появляется в верхней части веб-сайта.
- Тип пользователя – название типа пользователя, к которому он будет приписан. Выберите любой доступный тип пользователя из ниспадающего списка. Вы можете нажать на совместимые роли и количество совместимых дополнительных лицензий, чтобы узнать, что совместимо с выбранным типом пользователя.. Более подробно см. Типы пользователей, роли и права доступа.
role – Это роль корпоративной учетной записи в организации, использующей ArcGIS. Корректными значениями ролей являются: user (пользователь), publisher (издатель), admin (администратор) и <custom_role_name>, где <custom_role_name> – это имя настраиваемой роли (к примеру, hostedservicepublisher).
Прежние версии:
В Portal for ArcGIS 10.3 и более ранних версий поддерживались следующие не настраиваемые роли: org_user, org_publisher и org_admin. В 10.3.1 эти значения устарели и заменены перечисленными выше. Можно продолжить использование старых ролей в версии 10.3.1, но не забывайте, что в следующих версиях программы эти значения могут не поддерживаться.
description – описание, содержит текст с описанием учетной записи. Это значение не соответствует какому-либо атрибуту в хранилище учетных данных. Описание не может быть более 250 символов.
Idp UserName – дополнительно, укажите имя пользователя корпоративной учетной записи в провайдере аутентификаций. Если это значение не будет предоставлено, то вместо него используется значение, указанное для параметра учетной записи.
Вам необходимо указать имя учетной записи, адрес электронной почты, имя и роль. Описание и Idp UserName заполнять необязательно. Убедитесь, что значения имени учетной записи, адреса электронной почты и имени, которые вы ввели для каждой учетной записи, перечисленной в файле, полностью совпадают со значениями в вашем хранилище учетных данных. Портал не будет подключаться к вашему хранилищу учетных данных для проверки этих значений.
Далее показан пример записи регистрации корпоративной учетной записи Active Directory для имени пользователя jcho111 с email-адресом jcho@domain.com и полным именем Jon Cho. Имя пользователя размещено в его роли (user), а тип пользователя Viewer имеет описание, например, "пользователь департамента b":
jcho111@DOMAIN|jcho@domain.com|Jon Cho|Viewer|user|department b
Далее показан пример записи регистрации корпоративной учетной записи из провайдера аутентификаций SAML. Имя пользователя (логин) – rsmith@domain.com, адрес его электронной почты – rsmith@domain.com, а полное имя – Robert Smith. Имени пользователя назначена роль издателя (publisher) и тип пользователя Creator, у которого rsmith@domain.com в качестве UserName в провайдере аутентификаций (Idp UserName).
rsmith@domain.com|rsmith@domain.com|Robert Smith|Creator|publisher||rsmith@domain.com
Ниже представлен пример записи регистрации корпоративной учетной записи LDAP для имени пользователя sjames4513 с адресом электронной почты sjames@domain.com и полным именем Sara James. Это имя пользователя записано с ролью пользователя (admin) и типом пользователя GIS Professional, а также приведено описание.
sjames4513@DOMAIN|sjames@domain.com|Sara James|GISProfessional|admin|Department Lead and GIS Manager
Ниже представлен пример записи регистрации корпоративной учетной записи для имени пользователя srajhandas с адресом электронной почты srajhandas@domain.com и полным именем Satish Rajhandas. Имя пользователя размещено в его роли (user) и типе пользователя Viewer.
srajhandas@DOMAIN|srajhandas@domain.com|Satish Rajhandas|Viewer|user
Далее показан пример записи регистрации корпоративной учетной записи из провайдера аутентификаций SAML. Логин пользователя – djohnson308, адрес его электронной почты – djohnson@domain.com, а полное имя – Daisha Johnson. Этому логину назначена роль пользователя (user) и тип пользователя Creator, также введено описание и задано djohnson@domain.com в качестве UserName в провайдере аутентификаций.
djohnson308@DOMAIN|djohnson@domain.com|Daisha Johnson|Creator|user|Account Specialist|djohnson@domain.com
Добавление встроенных учетных записей портала
При добавлении встроенных учетных записей портала формат каждой записи в текстовом файле выглядит следующим образом:
<username>|<password>|<email address>|<name>|<user type>|<role>|<description>
- username – имя пользователя, используемое для встроенной учетной записи. Имена пользователей должны быть уникальны; два участника не могут иметь одинаковые имена.
- password – пароль, заданный для данной учетной записи. Пользователи могут использовать его во время первого входа на портал, а затем изменить пароль, отредактировав свой профиль.
- email address – Укажите адрес email для учетной записи. Этот параметр является обязательным. Поэтому укажите адрес email, даже если он некорректный.
- name – псевдоним учетной записи, который будет использоваться в вашей организации ArcGIS. При подключении пользователя к веб-сайту портала это имя появляется в верхней части веб-сайта портала.
- Тип пользователя – название типа пользователя, к которому он будет приписан. Выберите любой доступный тип пользователя из ниспадающего списка. Вы можете нажать на совместимые роли и количество совместимых дополнительных лицензий, чтобы узнать, что совместимо с выбранным типом пользователя.. Более подробно см. Типы пользователей, роли и права доступа.
- role – роль, назначенная учетной записи в организации ArcGIS. Корректными значениями ролей являются: user (пользователь), publisher (издатель), admin (администратор) и <custom_role_name>, где <custom_role_name> – это имя настраиваемой роли (к примеру, hostedservicepublisher).
- description – описание, содержит текст с описанием учетной записи. Описание не может быть более 250 символов.
Ниже представлен пример записи, добавляющей встроенную учетную запись портала с именем пользователя pub1 для Барбары Уильямс и адресом электронной почты bwilliams@domain.com. В этом примере для pub1 назначена роль издателя.
pub1|changepasswordlater|bwilliams@domain.com|Barbara Williams|Creator|publisher
Ниже представлен пример записи, добавляющей встроенную учетную запись портала с именем пользователя jcho для Jon Cho и адресом электронной почты jcho@domain.com. Этой же записью для jcho назначается роль администратора с описанием ГИС-менеджер.
jcho|changepasswordlater|jcho@domain.com|Jon Cho|GISProfessional|admin|GIS Manager
#!/usr/bin/env python
# Requires Python 2.7+
# Demonstrates how to add users to the ArcGIS Enterprise portal in bulk
# For Http calls
import urllib2, urllib, json
# For system tools
import sys, os
# For reading passwords without echoing
import getpass
# Other utilities
import Queue
# Defines the entry point into the script
def main(argv):
print "This script adds users in bulk into a portal. \n"
#Get parameters
parameters = getParametersFromUser ()
portalURL = parameters['portalURL']
provider = parameters['provider']
userName = parameters['userName']
password = parameters['password']
inUserFile = parameters['inUserFile']
#Get user data from file
usersData = getUserDataFromFile(inUserFile,provider)
#Create users
createUsers (userName,password, portalURL,provider, usersData)
raw_input('Press ENTER to close the script.')
return
# This function loads all the user data in the input text file into a Python Queue.
# This usersQueue can be later passed to the createUsers function
def getUserDataFromFile(inUserFile,provider):
usersQ = Queue.Queue()
inFileHandle = open(inUserFile, 'r')
userCount = 0
print '...Processing input users file at: ' + inUserFile
entryCount = 1
roleID = {'admin':'org_admin', 'publisher':'org_publisher', 'user':'org_user', 'viewer':'iAAAAAAAAAAAAAAA'}
for line in inFileHandle.readlines():
userParams = line.strip('\n').split('|')
userParamDict = {}
if provider=="enterprise":
keyParams = ['username', 'email', 'fullname', 'role', 'userLicenseTypeId', 'description', 'idpUsername', 'firstname', 'lastname']
if len(userParams) == len(keyParams):
for i, param in enumerate(keyParams):
userParamDict[param] = userParams[i]
if userParamDict['role'] in roleID.keys():
userParamDict['role'] = roleID[userParamDict['role']]
else:
print('The value for the user role "{}" in users text file is invalid.'.format(userParamDict['role']))
print('Accepted values are viewer, user, publisher, or admin.')
raise SystemExit('Invalid user role')
usersQ.put(userParamDict)
userCount = userCount + 1
else:
print('The format for entry "{}" is invalid.\nThe format for enterprise accounts is:'.format(line.strip('\n')))
print(' <login>|<email address>|<full name>|<role>|<user type id>|<description>|<idp username>|<first name>|<last name>')
raise SystemExit('Invalid format')
elif provider=="arcgis":
keyParams = ['username', 'password', 'email', 'fullname', 'role', 'userLicenseTypeId', 'description', 'firstname', 'lastname']
if len(userParams) == len(keyParams):
for i, param in enumerate(keyParams):
userParamDict[param] = userParams[i]
if userParamDict['role'] in roleID.keys():
userParamDict['role'] = roleID[userParamDict['role']]
else:
print('The value for the user role "{}" in users text file is invalid.'.format(userParamDict['role']))
print('Accepted values are viewer, user, publisher, or admin.')
raise SystemExit('Invalid user role')
usersQ.put (userParamDict)
userCount = userCount + 1
else:
print('The format for entry "{}" is invalid.\nThe format for built-in accounts is:'.format(line.strip('\n')))
print(' <account>|<password>|<email address>|<full name>|<role>|<description>|<first name>|<last name>|<level>')
raise SystemExit('Invalid format')
else:
raise SystemExit( 'The value for the user type is invalid. ')
entryCount = entryCount +1
inFileHandle.close()
# Create users and report results
print '...Total members to be added: ' + str(userCount)
return usersQ
# This function connects to the portal and adds members to it from a collection
def createUsers(username,password, portalUrl, provider,userParamsQ):
print '...Connecting to ' + portalUrl
token = generateToken(username,password, portalUrl)
print '...Adding users '
usersLeftInQueue = True
while usersLeftInQueue:
try:
userDict = userParamsQ.get(False)
userDict['f'] = 'json'
userDict['token'] = token
userDict['provider'] = provider
params = urllib.urlencode(userDict)
request = urllib2.Request(portalUrl + '/portaladmin/security/users/createUser?',params, { 'Referer' : portalUrl })
# POST the create request
response = urllib2.urlopen(request).read()
responseJSON = json.loads(response)
# Log results
if responseJSON.has_key('error'):
errDict = responseJSON['error']
if int(errDict['code'])==498:
message = 'Token Expired. Getting new token... Username: ' + userDict['username'] + ' will be added later'
token = generateToken(username,password, portalUrl)
userParamsQ.put(userDict)
else:
message = 'Error Code: %s \n Message: %s' % (errDict['code'], errDict['message'])
print '\n' + message
else:
# Success
if responseJSON.has_key('status'):
resultStatus = responseJSON['status']
print 'User: %s account created' % (userDict['username'])
except Queue.Empty:
usersLeftInQueue = False
# This function gets a token from the portal
def generateToken(username, password, portalUrl):
parameters = urllib.urlencode({'username' : username,
'password' : password,
'client' : 'referer',
'referer': portalUrl,
'expiration': 60,
'f' : 'json'})
try:
response = urllib.urlopen(portalUrl + '/sharing/rest/generateToken?',
parameters).read()
except Exception as e:
raise SystemExit( 'Unable to open the url %s/sharing/rest/generateToken' % (portalUrl))
responseJSON = json.loads(response.strip(' \t\n\r'))
# Log results
if responseJSON.has_key('error'):
errDict = responseJSON['error']
if int(errDict['code'])==498:
message = 'Token Expired. Getting new token... '
token = generateToken(username,password, portalUrl)
else:
message = 'Error Code: %s \n Message: %s' % (errDict['code'],
errDict['message'])
raise SystemExit(message)
token = responseJSON.get('token')
return token
# This function gets gets parameters from the user in interactive mode
def getParametersFromUser():
parameters = {}
# Get Location of users file
inUserFile = raw_input ("Enter path to users text file: ")
if not os.path.exists(inUserFile):
raise SystemExit( 'Input file: %s does not exist' % (inUserFile))
parameters['inUserFile'] = inUserFile
# Enteprise logins or built-in accounts?
userInput = raw_input ("What type of users do you want to add to the portal? Accepted values are built-in or enterprise: ")
if userInput.lower()=="built-in":
parameters['provider'] = 'arcgis'
print ' Built-in accounts will be added to the portal. \n'
elif userInput.lower()=="enterprise":
parameters['provider'] = 'enterprise'
print ' Enterprise accounts will be added to the portal. \n'
else:
raise SystemExit( 'The value entered for the user type %s is invalid. Accepted values are built-in or enterprise. ' % (userInput))
# Get Portal URL
hostname = raw_input("Enter the fully qualified portal hostname (for example myportal.acme.com): ")
parameters['portalURL'] = 'https://' + hostname + ':7443/arcgis'
print ' Users will be added to portal at: ' + parameters['portalURL'] + '\n'
# Get a username and password with portal administrative privileges
parameters['userName'] = raw_input("Enter a built-in user name with portal administrative privileges: ")
parameters['password'] = getpass.getpass("Enter password: ")
print '\n'
return parameters
# Script start
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))