Добавление ролей учетных записей в PostgreSQL

Доступно с лицензией Standard или Advanced.

В PostgreSQL роли используются для авторизации в кластере баз данных и в базах данных. Отдельные пользователи называются ролями учетных записей. Вы должны также создать схему в этой базе данных для всех ролей пользователя, которые будут иметь объекты в базе геоданных. Чтобы использовать PostgreSQL с ArcGIS схема должна иметь то же имя, что и роль учетной записи.

Можно выполнить инструмент Создать пользователя базы данных для добавления роли учетной записи, которая может создавать таблицы и классы объектов. Инструмент создает роль учетной записи в кластере базы PostgreSQL, соответствующую схему в указанной базе данных и предоставляет права доступа usage к новой схеме.

Если вы хотите создать роль учетной записи, не имеющую схемы и, следовательно, не имеющую возможности создания объектов в базе геоданных, можно использовать клиентское приложение PostgreSQL, такое как pgAdmin III или PL/pgSQL для создания роли в кластере базы данных PostgreSQL.

Вы можете также создать роли группы, к которым можно добавить роли пользователя. Затем можно определить права доступа для группы, которые будут применяться ко всем связанным ролям пользователя. Вы можете использовать инструмент Создать роль или скрипт для создания групповых ролей, или использовать SQL.

Примечание:

Кроме того, нужно создать соответствующую схему для каждой роли пользователя в группе, которая будет владеть объектами в базе геоданных. Вы не можете создать схему для роли группы.

Добавление пользователя, который может создавать объекты базы данных

Вы можете запустить инструмент Создать пользователя базы данных из ArcGIS Desktop или вызвать инструмент в скрипте Python для создания пользователя базы данных, который может создавать таблицы, классы объектов и представления.

Чтобы запустить инструмент Создать пользователя базы данных необходимо подключиться к базе данных с помощью роли со статусом superuser.

Использование инструмента Создать пользователя базы данных

  1. Запустите клиент ArcGIS Desktop.
  2. Подключитесь к базе данных или геоданных с помощью роли PostgreSQL со статусом superuser.
  3. Откройте инструмент Создать пользователя базы данных.

    Инструмент находится в группе инструментов Администрирование базы геоданных набора Управление данными.

  4. Укажите подключение к базе данных в поле Входное подключение к базе данных.
  5. Введите имя пользователя и роли учетной записи, которые будут созданы инструментом.
  6. Введите пароль пользователя базы данных.
  7. Если у вас уже есть роль группы, к которой должен принадлежать пользователь, укажите ее.
  8. Щелкните OK (ArcMap) или Запустить (ArcGIS Pro).

Запуск скрипта Python

Чтобы создать пользователя с помощью скрипта, выполните следующие шаги:

  1. Создайте текстовый файл на клиентском компьютере ArcGIS и скопируйте следующий скрипт в файл.

    """
    Name: create_database_user.py
    Description: Provide connection information to a database user.
    Type create_database_user.py -h or create_database_user.py --help for usage
    """
    
    # Import system modules
    import arcpy
    import os
    import optparse
    import sys
    
    
    # Define usage and version
    parser = optparse.OptionParser(usage = "usage: %prog [Options]", version="%prog 1.0 for 10.1 release")
    
    #Define help and options
    parser.add_option ("--DBMS", dest="Database_type", type="choice", choices=['SQLSERVER', 'ORACLE', 'POSTGRESQL', ''], default="", help="Type of enterprise DBMS:  SQLSERVER, ORACLE, or POSTGRESQL.")                   
    parser.add_option ("-i", dest="Instance", type="string", default="", help="DBMS instance name")
    parser.add_option ("-D", dest="Database", type="string", default="none", help="Database name:  Not required for Oracle")
    parser.add_option ("--auth", dest="Account_authentication", type ="choice", choices=['DATABASE_AUTH', 'OPERATING_SYSTEM_AUTH'], default='DATABASE_AUTH', help="Authentication type options (case-sensitive):  DATABASE_AUTH, OPERATING_SYSTEM_AUTH.  Default=DATABASE_AUTH")
    parser.add_option ("-U", dest="Dbms_admin", type="string", default="", help="DBMS administrator user")
    parser.add_option ("-P", dest="Dbms_admin_pwd", type="string", default="", help="DBMS administrator password")
    parser.add_option ("--utype", dest="user_type", type ="choice", choices=['DATABASE_USER', 'OPERATING_SYSTEM_USER'], default='DATABASE_USER', help="Authentication type options (case-sensitive):  DATABASE_USER, OPERATING_SYSTEM_USER.  Default=DATABASE_USER")
    parser.add_option ("-u", dest="dbuser", type="string", default="", help="database user name")
    parser.add_option ("-p", dest="dbuser_pwd", type="string", default="", help="database user password")
    parser.add_option ("-r", dest="role", type="string", default="", help="role to be granted to the user")
    parser.add_option ("-t", dest="Tablespace", type="string", default="", help="Tablespace name")
    # Check if value entered for option
    try:
    	(options, args) = parser.parse_args()
    
    	#Check if no system arguments (options) entered
    	if len(sys.argv) == 1:
    		print "%s: error: %s\n" % (sys.argv[0], "No command options given")
    		parser.print_help()
    		sys.exit(3)
    
    	#Usage parameters for spatial database connection
    	database_type = options.Database_type.upper()
    	instance = options.Instance
    	database = options.Database.lower()	
    	account_authentication = options.Account_authentication.upper()
    	dbms_admin = options.Dbms_admin
    	dbms_admin_pwd = options.Dbms_admin_pwd
    	dbuser = options.dbuser
    	dbuser_pwd = options.dbuser_pwd	
    	tablespace = options.Tablespace
    	user_type = options.user_type
    	role = options.role
    
    	
    	if (database_type == "SQLSERVER"):
    		database_type = "SQL_SERVER"
    	
    	if( database_type ==""):	
    		print(" \n%s: error: \n%s\n" % (sys.argv[0], "DBMS type (--DBMS) must be specified."))
    		parser.print_help()
    		sys.exit(3)		
    	
    	if(database_type == "SQL_SERVER"):
    		if( account_authentication == "DATABASE_AUTH" and dbms_admin == ""):
    			print("\n%s: error: %s\n" % (sys.argv[0], "DBMS administrator must be specified with database authentication"))
    			sys.exit(3)
    		if( account_authentication == "OPERATING_SYSTEM_AUTH" and dbms_admin != ""):
    			print("\nWarning: %s\n" % ("Ignoring DBMS administrator specified when using operating system authentication..."))
    	else:		
    		if( dbuser.lower() == ""):
    			print("\n%s: error: %s\n" % (sys.argv[0], "Database user must be specified."))
    			sys.exit(3)		
    		if( dbms_admin == ""):
    			print("\n%s: error: %s\n" % (sys.argv[0], "DBMS administrator must be specified!"))
    			sys.exit(3)
    
    	if ( user_type == "DATABASE_USER" and (dbuser =="" or dbuser_pwd =="")):
    		print(" \n%s: error: \n%s\n" % (sys.argv[0], "To create database authenticated user, user name and password must be specified!"))
    		parser.print_help()
    		sys.exit(3)	
    
    	# Get the current product license
    	product_license=arcpy.ProductInfo()
    	
    	# Checks required license level
    	if product_license.upper() == "ARCVIEW" or product_license.upper() == 'ENGINE':
    		print("\n" + product_license + " license found!" + "  Creating a user in an enterprise geodatabase or database requires an ArcGIS Desktop Standard or Advanced, ArcGIS Engine with the Geodatabase Update extension, or ArcGIS Server license.")
    		sys.exit("Re-authorize ArcGIS before creating a database user.")
    	else:
    		print("\n" + product_license + " license available!  Continuing to create...")
    		arcpy.AddMessage("+++++++++")
    
    	# Local variables
    	instance_temp = instance.replace("\\","_")
    	instance_temp = instance_temp.replace("/","_")
    	instance_temp = instance_temp.replace(":","_")
    	Conn_File_NameT = instance_temp + "_" + database + "_" + dbms_admin   
    
    	if os.environ.get("TEMP") == None:
    		temp = "c:\\temp"	
    	else:
    		temp = os.environ.get("TEMP")
    	
    	if os.environ.get("TMP") == None:
    		temp = "/usr/tmp"		
    	else:
    		temp = os.environ.get("TMP")  
    
    	Connection_File_Name = Conn_File_NameT + ".sde"
    	Connection_File_Name_full_path = temp + os.sep + Conn_File_NameT + ".sde"
    	
    	# Check for the .sde file and delete it if present
    	arcpy.env.overwriteOutput=True
    	if os.path.exists(Connection_File_Name_full_path):
    		os.remove(Connection_File_Name_full_path)
    
    	try:
    		print("\nCreating Database Connection File...\n")
    		# Process: Create Database Connection File...
    		# Usage:  out_file_location, out_file_name, DBMS_TYPE, instnace, database, account_authentication, username, password, save_username_password(must be true)
    		#arcpy.CreateDatabaseConnection_management(temp , Connection_File_Name, database_type, instance, database, account_authentication, dbms_admin, dbms_admin_pwd, "TRUE")
    		arcpy.CreateDatabaseConnection_management(out_folder_path=temp, out_name=Connection_File_Name, database_platform=database_type, instance=instance, database=database, account_authentication=account_authentication, username=dbms_admin, password=dbms_admin_pwd, save_user_pass="TRUE")
    	        for i in range(arcpy.GetMessageCount()):
    			if "000565" in arcpy.GetMessage(i):   #Check if database connection was successful
    				arcpy.AddReturnMessage(i)
    				arcpy.AddMessage("\n+++++++++")
    				arcpy.AddMessage("Exiting!!")
    				arcpy.AddMessage("+++++++++\n")
    				sys.exit(3)            
    			else:
    				arcpy.AddReturnMessage(i)
    				arcpy.AddMessage("+++++++++\n")
    
    		print("Creating database user...\n")
    		arcpy.CreateDatabaseUser_management(input_workspace=Connection_File_Name_full_path, user_authentication_type=user_type, user_name=dbuser, user_password=dbuser_pwd, role=role, tablespace_name=tablespace)
    		for i in range(arcpy.GetMessageCount()):
    			arcpy.AddReturnMessage(i)
    		arcpy.AddMessage("+++++++++\n")
    	except:
    		for i in range(arcpy.GetMessageCount()):
    			arcpy.AddReturnMessage(i)
    			
    #Check if no value entered for option	
    except SystemExit as e:
    	if e.code == 2:
    		parser.usage = ""
    		print("\n")
    		parser.print_help()   
    		parser.exit(2)

    Вы можете запустить скрипт на компьютере с установленным ArcGIS Desktop (Standard или Advanced), ArcGIS Server (Standard или Advanced) или ArcGIS Engine с дополнительным модулем Geodatabase Update.

  2. Сохраните файл с расширением .py.
  3. Запустите скрипт, задав опции и указав сведения, соответствующие вашему кластеру базы данных PostgreSQL и роли учетной записи, которую вы хотите создать.

    В следующем примере запуск выполняется с сервера Microsoft Windows, имя скрипта create_database_user.py. В кластере базы данных PostgreSQL pgdb7 создается роль учетной записи (geodata), проверяемая средствами базы данных, а в базе данных gisdata создается соответствующая схема. Пользователь не добавляется в групповую роль.

    create_database_user.py --DBMS POSTGRESQL -i pgdb7 -D gisdata -U postgres -P $hHhH --utype DATABASE_USER -u geodata -p 0wn1t

    Это пример запуска скрипта на компьютере с Linux:

    ./create_database_user.py --DBMS POSTGRESQL -i pgdb7 -D gisdata -U postgres -P $hHhH --utype DATABASE_USER -u geodata -p 0wn1t

    Подсказка:

    Введите -h или --help в командной строке для вывода справки синтаксиса.

Теперь ваша база данных содержит пользователя, который может создавать таблицы.

Создание учетных записей для просмотра и редактирования данных

Вы можете использовать SQL для создания ролей ученых записей для пользователей, которые не будут создавать данные. Если вы делаете это для вашей базы геоданных в PostgreSQL, убедитесь, что либо общедоступная группа, либо конкретный пользователь имеет права на создание временных таблиц.

Также вы можете создать группы учетных записей, чтобы облегчить предоставление прав доступа к отдельным наборам данных для таких пользователей.

Создание ролей

В следующих шагах описано, как использовать psql для создания групповых ролей, для облегчения управления доступом к данным, и создания ролей учетных записей, входящих в групповые роли.

  1. Войдите в psql в качестве пользователя с правами создания других ролей в кластер базы данных. Это может быть учетная запись со статусом superuser или запись с правами createrole.
  2. Сначала используйте команду create role для создания двух групп учетных записей: одну для пользователей, которые могут редактировать наборы данных (редакторы), а другую – для пользователей, которые могут только просматривать данные (читатели).

    CREATE ROLE editors 
    NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT;
    CREATE ROLE viewers
    NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT;

  3. Затем создайте роли, которые будут участниками группы редакторов.

    В данном примере роль учетной записи (editor1) создается с шифрованным паролем. Роль не имеет статуса superuser, не может создавать базы данных и не может создавать роли в кластере базы данных. Однако она является участником групповой роли издателей и наследует права этой групповой роли.

    CREATE ROLE editor1 LOGIN 
    ENCRYPTED PASSWORD 'sooper.secret' 
    NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT IN ROLE editors;
    Измените имя роли учетной записи и снова запустите выражение, чтобы создать дополнительные роли, которые смогут редактировать данные в базе геоданных.

  4. Теперь создайте роли, которые будут участниками группы читателей.

    В данном примере роль учетной записи (reader1) создается с шифрованным паролем. Роль не имеет статуса superuser, не может создавать базы данных и не может создавать роли в кластере базы данных. Однако она является участником групповой роли читателей и наследует все права этой роли.

    CREATE ROLE reader1 LOGIN 
    ENCRYPTED PASSWORD 'almostas.secret' 
    NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT IN ROLE viewers;
    Измените имя роли учетной записи и снова запустите выражение, чтобы создать дополнительные роли, которые могут только просматривать данные в базе геоданных.

  5. Каждой группе учетных записей предоставьте права usage для схемы geodata.

    Права usage позволяют участникам групп издателей и читателей получать доступ к данным в схеме geodata. Без этого geodata не предоставит права доступа к отдельным наборам данных участникам групповых ролей читателей и издателей.

    GRANT USAGE ON SCHEMA geodata TO editors;
    GRANT USAGE ON SCHEMA geodata TO viewers;
  6. Если вы создаете эти учетные записи для базы геоданных и изменили права доступа к схеме sde так, чтобы при публичном доступе права usage не предоставлялись, предоставьте права usage к схеме sde для групп редакторов и читателей.
    GRANT USAGE ON SCHEMA sde TO editors;
    GRANT USAGE ON SCHEMA sde TO viewers;

Теперь база данных содержит одного или нескольких пользователей, которые могут редактировать данные, и одного или нескольких пользователей, которые могут их только просматривать.

Если набор данных существует в базе данных или базе геоданных, владелец может предоставить к нему права select для группы читателей и права select, insert, update и delete для группы редакторов. Инструкции см. в разделе Предоставление и отзыв прав доступа к наборам данных.