يستعمل هذا المثال ملف نصي مُدخل مع معلومات حول المستخدمين وإضافتها للمدخل في مجموعة. قم بتعريف ومنح دور كل مستخدم في البوابة الإلكترونية.
أدخل المعلومات المطلوبة التالية عند تشغيل البرنامج النصي:
- مسار الملف النصي الذي يحتوي على معلومات المستخدم، مثل /home/admin/documents/users.txt.
- أنواع المستخدمين المضافين إلى المدخل، على سبيل المثال، مضمن أو مؤسسي. للتعرف على المزيد حول أنواع المستخدمين، راجع إدارة الوصول إلى المدخل.
- اسم جهاز المجال المؤهل كليةً والذي يستضيف المدخل، على سبيل المثال، myportal.acme.com. يقوم البرنامج النصي بالوصول إلى البوابة الإلكترونية عن طريق HTTPS على المنفذ 7443 وتجاوز ArcGIS Web Adaptor. في هذا السلوك، لا يحتاج البرنامج النصي التعامل مع مصادقة طبقة الويب إذا تم تكوين المدخل للاستخدام.
- يحتوي اسم المستخدم وكلمة السر بالحساب على امتيازات إدارية للمدخل. عند إضافة حسابات داخلية، قم بتوفير بيانات اعتماد أي مستخدم في البوابة الإلكترونية باستخدام الامتيازات الإدارية. عند إضافة حسابات مؤسسية، استخدم حساب المسئول الأولي الذي تم إنشاؤه بعد التثبيت Portal for ArcGIS.
ملاحظة:
يخرج استعراض كيفية عمل برامج بايثون النصية لمعالجة مصادقة طبقة ويب عن منظور المثال.
تسجيل الحسابات المؤسسية
عند تسجيل الحسابات المؤسسية، يكون تنسيق كل مدخل في الملف النصي كما يلي:
<login>|<email address>|<name>|<role>|<description>|<Idp UserName>
تسجيل الدخول—تسجيل الدخول على المؤسسة للتسجيل.
- عند استخدام الدليل النشط، سيصبح شكل تسجيل الدخول على شكل sAMAccountName@DOMAIN. يتعين أن يكون اسم المجال ذات أحرف كبيرة.
- عند استخدام LDAP، يتعين أن يتطابق تسجيل الدخول مع قيمة userNameAttribute التي تم تحديدها عند تكوين متجر الهوية.
- عند استخدام عمليات تسجيل الدخول المؤسسية المُستندة إلى SAML، يجب أن تتطابق قيمة تسجيل الدخول المُحددة مع NameID البيانات الجدولية في موفر هوية SAML.
عنوان البريد الإلكتروني - ينبغي أن يتطابق عنوان البريد الإلكتروني مع تسجيل الدخول ويتطابق مع القيمة في متجر الهوية. إذا لم يكن لحساب المستخدم عنوان بريد إلكتروني، قم بتوفير قيمة خطأ أو عام.
الاسم—الاسم هو الاسم المستعار لتسجيل الدخول المستخدم في مؤسسة ArcGIS. تستخدم معظم مخازن الهوية اسم المستخدم الكامل بصفته اسم مستعار افتراضي. عند اتصال المستخدم بموقع البوابة الإلكتروني، سيظهر الاسم أعلى موقع الويب.
الدور—هو دور تسجيل الدخول المؤسسي ال>ي سيتم الحصول عليه في مؤسسة ArcGIS. تشمل قيم الدور الصحيحة مستخدمأو ناشرأو مديرأو <custom_role_name>حيث <custom_role_name> هو اسم الدور المخصص (مثل، hostedservicepublisher).
قديم:
في Portal for ArcGIS 10.3 والإصدارات السابقة، كانت القيم المقبولة للأدوار غير المخصصة هي org_user، org_publisher، و org_admin. في الإصدار 10.3.1، لقد تم إهمال هذه القيم واستبدالها بالقيم المدرجة أعلاه. يمكنك الاستمرار لاستخدام القيم القديمة في الإصدار 10.3.1، لكن لاحظ أنه لا يمكن قبول القيم في الإصدارات المستقبلية.
الوصف - يتضمن النص اللازم لوصف الحساب بشكل اختياري. لا تتطابق هذه القيمة مع أي من البيانات الجدولية في مخزن الهوية. لا يمكن أن تتعدى الأوصاف 250 حرف.
Idp UserName - تحديد اسم مستخدم الحساب المؤسسي اختيارًا في مُزود الهوية. إذا لم تتوفر هذه القيمة، يتم استخدام القيمة المحددة لمعلمة تسجيل الدخول بدلاً منه.
يتطلب توفير القيمة لتسجيل الدخول وعنوان البريد الإلكتروني والاسم والدور. يُعد الوصف وIdp UserName اختيارييّن. فيما يتعلق بكل حساب مُدرج في الملف، تأكد من تطابق القيم التي يتم إدخالها لتسجيل الدخول وعنوان البريد الإلكتروني والاسم مع القيم في مخزن الهوية. لن تتصل البوابة الإلكترونية بمخزن الهوية للتحقق من هذه القيم.
فيما يلي مثال للإدخال لتسجيل حساب دليل نَشِط مؤسسي لتسجيل دخول jcho111 باستخدام عنوان البريد الإلكتروني jcho@domain.com والاسم الكامل لـ Jon Cho. يتم وضع تسجيل الدخول في دور المستخدم (المستخدم) ويتم وصفه كمستخدم في القسم ب:
jcho111@DOMAIN|jcho@domain.com|Jon Cho|user|department b
فيما يلي مثال لإدخال لتسجيل حساب مؤسسي من مُزود هوية SAML. تسجيل دخول المستخدم هو rsmith@domain.com باستخدام عنوان بريد إلكتروني لـ rsmith@domain.com والاسم الكامل لـ Robert Smith. يتم وضع تسجيل الدخول في دور الناشر (الناشر) باستخدام Idp UserName لـ rsmith@domain.com.
rsmith@domain.com|rsmith@domain.com|Robert Smith|publisher||rsmith@domain.com
فيما يلي مثال لإدخال لتسجيل حساب LDAP مؤسسي لتسجيل دخول sjames4513 باستخدام عنوان البريد الإلكتروني لـ sjames@domain.com والاسم الكامل لـ Sara James. يتم وضع تسجيل الدخول في دور المستخدم (المسئول) ويتم توفير وصف.
sjames4513@DOMAIN|sjames@domain.com|Sara James|admin|Department Lead and GIS Manager
فيما يلي مثال لإدخال لتسجيل الحساب المؤسسي لتسجيل دخول srajhandas باستخدام عنوان البريد الإلكتروني لـ srajhandas@domain.com والاسم الكامل لـ Satish Rajhandas. يتم وضع تسجيل الدخول في دور المستخدم (المستخدم).
srajhandas@DOMAIN|srajhandas@domain.com|Satish Rajhandas|user
فيما يلي مثال لإدخال لتسجيل حساب مؤسسي من مُزود هوية SAML. تسجيل دخول المستخدم هو djohnson308 باستخدام عنوان بريد إلكتروني djohnson@domain.com والاسم الكامل لـ Daisha Johnson. يتم وضع تسجيل الدخول في دور المستخدم (المستخدم)، ويتم توفير وصف، ويتم تعريف Idp UserName على أنه djohnson@domain.com.
djohnson308@DOMAIN|djohnson@domain.com|Daisha Johnson|user|Account Specialist|djohnson@domain.com
إضافة حسابات مدخل مضمنة
عند إضافة حسابات البوابة الإلكترونية الداخلية، يكون تنسيق المدخلات في الملف النصي كما يلي:
<username>|<password>|<email address>|<name>|<role>|<description>
- اسم المستخدم - اسم المُستخدِم المُستَخدَم للحساب المضمن. يجب أن تكون أسماء المستخدمين فريدة، لا يمكن لمستخدمين الحصول على نفس الاسم.
- كلمة المرور - كلمة المرور المُعيّنة للحساب. يمكن استخدام المستخدمين لأول مرة يتم تسجيل الدخول في المدخل، بعدها يمكن تغيير كلمة السر بواسطة تحرير الملف التعريفي.
- البريد الإلكتروني—قم بتوفير بريد إلكتروني للحساب. يتم طلب المعلمة. لذلك، يجب توفير قيمة البريد الإلكتروني حتى لو كان عنوان غير صحيح.
- الاسم - الاسم المستعار للحساب المستخدم في مؤسسة ArcGIS. عند اتصال المستخدم بموقع البوابة الإلكترونية على الويب، يظهر هذا الاسم أعلى الموقع.
- الدور- الدور الخاص بالحساب في مؤسسة ArcGIS. تشمل قيم الدور الصحيحة المستخدم، الناشر، المسئول، أو <custom_role_name>، حيث أن <custom_role_name> هو اسم الدور المخصص (على سبيل المثال، hostedservicepublisher).
- الوصف - يتضمن النص اللازم لوصف الحساب بشكل اختياري. لا يمكن أن تتعدى الأوصاف 250 حرف.
فيما يلي مثال لإدخال يعمل على إضافة حساب مُضمن في البوابة الإلكترونية باسم المستخدم pub1 لـ Barbara Williams بحساب بريد إلكتروني bwilliams@domain.com. كما يضيف pub1 إلى دور الناشر:
pub1|changepasswordlater|bwilliams@domain.com|Barbara Williams|publisher
فيما يلي مثال لإدخال يعمل على إضافة حساب مُضمن في البوابة الإلكترونية باسم المستخدم jcho لـ Jon Cho بحساب بريد إلكتروني jcho@domain.com. كما يعمل على إضافة jcho إلى دور المسئول ويصفه على أنه مدير GIS:
jcho|changepasswordlater|jcho@domain.com|Jon Cho|admin|GIS Manager
#!/usr/bin/env python
# Requires Python 2.7+
# Demonstrates how to add users to Portal for ArcGIS in bulk
# For Http calls
import httplib, 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()
keyParams = ['username', 'password', 'email', 'fullname','role','description']
inFileHandle = open(inUserFile, 'r')
userCount = 0
print '...Processing input users file at: ' + inUserFile
entryCount = 1;
for line in inFileHandle.readlines():
userParams = line.split('|')
userParamDict = {}
if provider=="webadaptor":
if len(userParams) == 5:
for i in range (0,5):
userParamDict[keyParams[0]] = userParams[0] # login
userParamDict[keyParams[1]] = ""
userParamDict[keyParams[2]] = userParams[1] # email address
userParamDict[keyParams[3]] = userParams[2] # name
userParamDict[keyParams[4]] = userParams[3] # role
userParamDict[keyParams[5]] = userParams[4].replace('\n','') # description
usersQ.put (userParamDict)
userCount = userCount + 1
else:
print ' The format for entry %s is invalid. The format for enterprise accounts should be <login>|<email address>|<name>|<role>|<description>. \n '% (entryCount)
raise SystemExit( 'When registering enterprise accounts, the format for each entry is as follows: <login>|<email address>|<name>|<role>|<description>')
elif provider=="arcgis":
if len(userParams) == 6:
for i in range (0,6):
userParamDict[keyParams[0]] = userParams[0] # account
userParamDict[keyParams[1]] = userParams[1] # password
userParamDict[keyParams[2]] = userParams[2] # email address
userParamDict[keyParams[3]] = userParams[3] # name
userParamDict[keyParams[4]] = userParams[4] # role
userParamDict[keyParams[5]] = userParams[5].replace('\n','') # description
usersQ.put (userParamDict)
userCount = userCount + 1
else:
print ' The format for entry %s is invalid. The format for built-in portal accounts should be <account>|<password>|<email address>|<name>|<role>|<description>. \n '% (entryCount)
raise SystemExit( 'When registering built-in portal accounts, the format for each entry is as follows: <account>|<password>|<email address>|<name>|<role>|<description>')
else:
print ' The provider is incorrect. Script ended. \n'
raise SystemExit( 'The value for the user type is invalid. ')
entryCount = entryCount +1
if not ((userParamDict[keyParams[4]].lower()== "user") or (userParamDict[keyParams[4]].lower()=="publisher") or (userParamDict[keyParams[4]].lower()== "admin")):
raise SystemExit( 'The value for the user role %s in users text file is invalid. Accepted values are user or publisher or admin. ' % (userParamDict[keyParams[4]]))
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 '\n' + 'User: %s account created' % (userDict['username'])
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):
'''Retrieves a token to be used with API requests.'''
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):
print ' File does not exist. Script ended. \n'
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'] = 'webadaptor'
print ' Enterprise accounts will be added to the portal. \n'
else:
print ' The type of users is incorrect. Script ended. \n'
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'] = raw_input("Enter password: ")
print '\n'
return parameters
# Script start
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))