Agregar roles de inicio de sesión a PostgreSQL

Disponible con una licencia Standard o Advanced.

PostgreSQL utiliza roles para iniciar sesión en el clúster de base de datos y las bases de datos. Los usuarios individuales se denominan roles de inicio de sesión. Para todos los roles de inicio de sesión que serán propietarios de objetos en la geodatabase, también debe crear un esquema en esa base de datos. Para usar PostgreSQL con ArcGIS, el esquema debe tener el mismo nombre que el rol de inicio de sesión y ser propiedad de este.

Puede usar la herramienta Crear usuario de base de datos para agregar un rol de inicio de sesión que pueda crear tablas y clases de entidad. La herramienta crea un rol de inicio de sesión autenticación de base de datos en el clúster de base de datos de PostgreSQL, crea un esquema de geocodificación para el usuario en la base de datos que especifique y otorga privilegios usage sobre el nuevo esquema al público.

Para crear un rol de inicio de sesión que no posea un esquema y que, por lo tanto, no pueda crear objetos en la geodatabase, o para crear un rol de inicio de sesión asignado a una interfaz de proveedor de soporte técnico de seguridad (SSPI) o un inicio de sesión de Protocolo de acceso ligero al directorio (LDAP), utilice una aplicación cliente PostgreSQL como pgAdmin o PL/pgSQL para crear un rol en el clúster de base de datos PostgreSQL.

También puede crear grupos de roles a los que se pueden agregar roles de inicio de sesión. A continuación, puede especificar permisos para el grupo que se aplicarán a todos los roles de inicio de sesión asociados. Puede usar la herramienta Crear rol o una secuencia de comandos para crear roles de grupo o bien utilizar SQL.

Nota:

Aún así, debe crear un esquema coincidente para cada rol de inicio de sesión que será propietario de objetos en la geodatabase. No se puede crear un esquema para el rol del grupo.

Agregar un usuario que puede crear objetos de base de datos

Puede ejecutar la herramienta Crear usuario de base de datos desde ArcGIS Pro o invocarla en un script de Python para crear un usuario de la base de datos que puede crear tablas, clases de entidad y vistas.

Debe conectarse a la base de datos mediante un rol con estado de superusuario para ejecutar la herramienta Crear usuario de base de datos.

Utilice la herramienta Crear usuario de base de datos

  1. Inicie ArcGIS Pro.
  2. Conéctese a la base de datos o geodatabase mediante un rol con autoridad de superusuario de PostgreSQL.
  3. Abra la herramienta Crear usuario de base de datos.

    La herramienta está en el conjunto de herramientas Administración de geodatabase de la caja de herramientas Administración de datos.

  4. Especifique la conexión de base de datos de Conexión de la base de datos de entrada.
  5. Escriba un nombre para el rol de inicio de sesión y el esquema que la herramienta creará.
  6. Escriba una contraseña para el usuario de la base de datos.
  7. Si ya tiene un rol del grupo del que desea que este usuario sea miembro, especifique dicho rol.
  8. Haga clic en Ejecutar.

Ejecutar un script de Python

Para crear usuarios mediante una secuencia de comandos, siga estos pasos:

  1. Cree un archivo de texto en un equipo cliente de ArcGIS y copie en él la secuencia de comandos siguiente.

    """
    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)

    Puede ejecutar el script desde un equipo que tenga instalado ArcGIS Pro (ArcGIS Desktop Standard o Advanced) o ArcGIS Server.

  2. Guarde el archivo con una extensión .py.
  3. Ejecute el script, proporcionando opciones e información específicas de su clúster de base de datos de PostgreSQL y el rol de inicio de sesión que desea crear.

    En el siguiente ejemplo ejecutado desde un servidor de Microsoft Windows, el nombre del script es create_database_user.py. En el clúster de base de datos de PostgreSQL pgdb7 se crea un rol de inicio de sesión autenticado de la base de datos (geodatos) y en la base de datos gisdata se crea el esquema correspondiente. El usuario no se agrega a un rol de grupo.

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

    Este es un ejemplo de la ejecución del script en un equipo con Linux:

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

    Sugerencia:

    Introduzca -h o --help en la ventana de comando para obtener ayuda con la sintaxis.

La base de datos ahora tiene un usuario que puede crear tablas.

Crear nombres de usuario para ver y editar datos

Puede usar SQL para crear roles de inicio de sesión para aquellos usuarios que no crearán datos. No obstante, si lo va a hacer para su geodatabase en PostgreSQL, asegúrese de que el grupo público o el usuario específico tenga privilegios para crear tablas temporales.

También puede crear grupos de inicio de sesión para facilitar la concesión de privilegios sobre datasets individuales a estos usuarios.

Crear roles

En los siguientes pasos se describe cómo usar psql para crear roles de grupo con el fin de simplificar la administración de privilegios de datos y crear roles de inicio de sesión que pertenezcan a los roles de grupo.

  1. Inicie sesión en psql como usuario con permisos para crear otros roles en el clúster de base de datos.

    Puede ser un nombre de usuario con estado de superusuario o uno con el privilegio createrole.

  2. Utilice el comando create role para crear dos grupos de inicio de sesión: uno para usuarios que pueden editar datasets (editores) y uno para usuarios que solo pueden ver datos (visores).

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

  3. A continuación, cree roles de inicio de sesión que sean miembros del grupo de editores.

    En este ejemplo se ha creado un rol de inicio de sesión (editor1) con una contraseña cifrada. El rol no tiene estado de superusuario y no puede crear bases de datos ni tampoco roles en el clúster de base de datos. Sin embargo, se ha convertido en miembro de los editores de roles de grupo y heredará privilegios de ese rol de grupo.

    CREATE ROLE editor1 LOGIN 
    ENCRYPTED PASSWORD 'sooper.secret' 
    NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT IN ROLE editors;
    Cambie el nombre del rol de inicio de sesión y ejecute la declaración de nuevo para crear roles de inicio de sesión adicionales que podrán editar datos en la geodatabase.

  4. Ahora, cree roles de inicio de sesión que sean miembros del grupo de visores.

    En este ejemplo, se ha creado un rol de inicio de sesión (reader1) con una contraseña cifrada. El rol no tiene estado de superusuario y no puede crear bases de datos ni tampoco roles en el clúster de base de datos. Sin embargo, se ha convertido en miembro de los visores de roles de grupo y heredará privilegios de ese rol de grupo.

    CREATE ROLE reader1 LOGIN 
    ENCRYPTED PASSWORD 'almostas.secret' 
    NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT IN ROLE viewers;
    Cambie el nombre del rol de inicio de sesión y ejecute la declaración de nuevo para crear roles de inicio de sesión adicionales que solo pueden ver datos en la geodatabase.

  5. Otorgue el privilegio usage sobre el esquema de geodatos a cada uno de los grupos de inicio de sesión.

    El privilegio usage permite a los miembros de los grupos de editores y visores acceder a datos del esquema de los geodatos. Sin este, los geodatos no podrían otorgar privilegios sobre datasets individuales a los miembros de los roles de grupo de visores y editores.

    GRANT USAGE ON SCHEMA geodata TO editors;
    GRANT USAGE ON SCHEMA geodata TO viewers;
  6. Si crea estos inicios de sesión para una geodatabase y modificó los privilegios del esquema sde de manera que el público no tenga usage sobre ella, otorgue privilegio usage sobre el esquemas de a los grupos de editores y visores.
    GRANT USAGE ON SCHEMA sde TO editors;
    GRANT USAGE ON SCHEMA sde TO viewers;

Ahora, su base de datos tiene uno o más usuarios que editarán datos y uno o más usuarios que verán datos.

Una vez que los datasets existen en la base de datos o la geodatabase, el propietario puede utilizar herramientas de ArcGIS para otorgar el privilegio privilegios select sobre los datasets al grupo de visores y privilegios select, insert, update y delete sobre los datasets al grupo de editores. Consulte Otorgar y revocar privilegios sobre datasets para obtener instrucciones.