One place for hosting & domains

      Cómo instalar y configurar SimpleSAMLphp para la autenticación SAML en Ubuntu 18.04


      Introducción

      SimpleSAMLphp es una aplicación de autenticación PHP de código abierto que ofrece soporte para SAML 2.0 como Proveedor de servicios (SP) o Proveedor de identidad (IdP).

      SAML (Security Assertion Markup Language) es un mecanismo de comunicación seguro basado en XML para intercambiar datos de autenticación y autorización entre organizaciones y aplicaciones. Se utiliza a menudo para implementar SSO web (autenticación única). Esto elimina la necesidad de mantener múltiples credenciales de autenticación en múltiples organizaciones. O dicho de otro modo, puede usar una identidad, como un nombre de usuario y contraseña, para acceder a múltiples aplicaciones.

      Una instancia de SimpleSAMLphp se conecta con una fuente de autenticación, que es un proveedor de identidad como LDAP o una base de datos de usuarios. Autentica a los usuarios contra esta fuente de autenticación antes de conceder acceso a los recursos disponibles de los Proveedores de servicios vinculados.

      A través de este tutorial, instalará SimpleSamlPHP y lo configurará para que utilice una base de datos de MySQL como fuente de autenticación. Almacenará los usuarios y las contraseñas cifradas en la base de datos MySQL y probará que puede utilizar esos usuarios para iniciar sesión.

      Requisitos previos

      Paso 1: Descargar e instalar SimpleSAMLphp

      Es necesario realizar un par de pasos para instalar SimpleSAMLphp. Tenemos que descargar el software en sí mismo así como algunos componentes y requisitos previos adicionales. También deberemos realizar algunos cambios en la configuración de nuestro host virtual.

      Inicie sesión en su servidor si no lo ha hecho aún.

      Descargue SimpleSAMLphp desde el sitio web del proyecto. SimpleSAMLphp siempre enlaza la última versión estable de su software a la misma URL. Esto significa que podemos obtener la última versión escribiendo esto:

      • wget https://simplesamlphp.org/download?latest

      Con esto, se descargará un archivo comprimido llamado download?latest que contiene SimpleSAMLphp. Extraiga el contenido con el comando tar:

      Los archivos se extraerán a un directorio nuevo con la etiqueta simplesamlphp-1.x.y​​​, donde x.y es el número de la versión actual. Utilice el comando ls para identificar el archivo:

      Verá el nombre del archivo:

      Ouptut

      simplesamlphp-1.18.5

      Ahora, copie el contenido del directorio a /var/simplesamlphp usando el comando cp. Asegúrese de sustituir el número de versión con la versión que tenga:

      • sudo cp -a simplesamlphp-1.x.y/. /var/simplesamlphp/

      El conmutador -a garantiza que los permisos del archivo se copien junto con los archivos y carpetas. El punto al final del archivo de origen garantiza que todo en el directorio de origen, incluyendo los archivos ocultos, se copian al directorio de destino.

      Nota: Si necesita instalar los archivos en una ubicación diferente, deberá actualizar varios archivos. Consulte la documentación de instalación oficial de SimpleSAMLphp para ver los detalles específicos.

      SimpleSAMLphp necesita algunos paquetes de software adicionales, como las extensiones de PHP para trabajar con XML, cadenas de bytes múltiples, curl y LDAP. También necesita memcached. Instale estos usando su administrador de paquetes.

      Primero, actualice su lista de paquetes:

      A continuación, instale los paquetes:

      • sudo apt install php-xml php-mbstring php-curl php-memcache php-ldap memcached

      Una vez que se complete la instalación, reinicie Apache para activar las nuevas extensiones de PHP:

      • sudo systemctl restart apache2

      Ahora que SimpleSAMLphp está instalado, configuraremos Apache para presentar los archivos.

      Paso 2: Configurar Apache para presentar SimpleSAMLphp

      Ya ha configurado un dominio y apuntado a este servidor, y ha configurado un host virtual para que funcione con HTTPS protegiendo Apache con Let´s Encrypt. Usaremos eso para presentar SimpleSAMLphp.

      El único directorio de SimpleSAMLphp que debe estar visible para la web es /var/simplesamlphp/www. Para exponerlo a la Web, edite el archivo de configuración de host virtual SSL de Apache para su dominio.

      Si su archivo de configuración de host virtual se llama your_domain.conf, Let´s Encrypt creó un nuevo archivo de configuración llamado your_domain-le-ssl.conf que gestiona las solicitudes HTTPS para su dominio. Abra el archivo de configuración SSL con el siguiente comando para editar el archivo. Asegúrese de sustituir your_domain por el nombre real del archivo:

      • sudo nano /etc/apache2/sites-available/your_domain-le-ssl.conf

      El archivo debería tener el siguiente aspecto, pero el archivo real puede tener comentarios más descriptivos:

      your_domain-le-ssl.conf’>/etc/apache2/sites-available/your_domain-le-ssl.conf

      <IfModule mod_ssl.c>
      <VirtualHost *:443>
              ServerName your_domain
      
              ServerAdmin webmaster@localhost
              DocumentRoot /var/www/html
      
              ErrorLog ${APACHE_LOG_DIR}/error.log
              CustomLog ${APACHE_LOG_DIR}/access.log combined
      
      SSLCertificateFile /etc/letsencrypt/live/your_domain/fullchain.pem
      SSLCertificateKeyFile /etc/letsencrypt/live/your_domain/privkey.pem
      Include /etc/letsencrypt/options-ssl-apache.conf
      </VirtualHost>
      </IfModule>
      

      La directiva ServerName aquí define el dominio base que debería coincidir con la definición de este host virtual. Este debería ser el nombre de dominio para el que configuró un certificado SSL en la sección de requisitos previos. Vamos a añadir una directiva Alias que proporciona control a SimpleSAMLphp para todas las URLs que coinciden con https://your_domain/simplesaml/*. Haga esto añadiendo la siguiente línea al archivo de configuración:

      your_domain-le-ssl.conf’>/etc/apache2/sites-available/your_domain-le-ssl.conf

      ...
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
      
        Alias /simplesaml /var/simplesamlphp/www
      
      ...
      

      Esto significa que domain_name/simplesaml/* se dirigirán al directorio /var/simplesamlphp/www que proporciona el control a SimpleSAMLphp.

      A continuación, concederemos acceso al directorio /var/simplesamlphp/www especificando un control de acceso Require all granted para el mismo. Esto hará que el servicio SimpleSAMLphp sea accesible en la Web. Haga esto añadiendo lo siguiente al archivo de configuración:

      your_domain-le-ssl.conf’>/etc/apache2/sites-available/your_domain-le-ssl.conf

      ...
        Alias /simplesaml /var/simplesamlphp/www
        <Directory /var/simplesamlphp/www/>
            Require all granted
        </Directory>
      ...
      

      Guarde y cierre el archivo. Reinicie Apache para implementar los cambios:

      • sudo systemctl restart apache2

      Ahora que Apache está configurado para presentar archivos de aplicación, vamos a configurar SimpleSAMLphp.

      Paso 3: Configurar SimpleSAMLphp

      A continuación, debemos realizar varios cambios en la configuración principal de SimpleSAMLphp ubicada en /var/simplesamlphp/config/config.php. Abra el archivo en su editor:

      • nano /var/simplesamlphp/config/config.php

      Configure la contraseña del administrador buscando la línea 'auth.adminpassword' y sustituyendo el valor predeterminado de 123 por una contraseña más segura. Esta contraseña le permite acceder a algunas de las páginas en su interfaz web de la instalación de SimpleSAMLphp:

      /var/simplesamlphp/config/config.php

      . . .
      'auth.adminpassword'        => 'your_admin_password',
      . . .
      

      A continuación, establezca un salt secreto, que debería ser una cadena de caracteres generada aleatoriamente. Algunas partes de SimpleSAMLphp utilizan este valor sal para crear hashes que ofrezcan seguridad a nivel criptográfico. Obtendrá errores si el salt no se cambia desde el valor predeterminado.

      Puede usar la función rand de OpenSSL para generar una cadena aleatoria que pueda usar como su cadena de valores sal secreta. Abra un nuevo terminal, conecte de nuevo con su servidor y ejecute el siguiente comando para generar esta cadena:

      La opción -base64 32 garantiza una cadena Base64 codificada de 32 caracteres.

      A continuación, en el archivo de configuración, localice la entrada 'secretsalt' y sustituya defaultsecretsalt por la cadena que generó:

      /var/simplesamlphp/config/config.php

      . . .
      'secretsalt' => 'your_generated_salt',
      . . .
      

      Luego establezca la información de contacto técnico. Esta información estará disponible en los metadatos generados y SimpleSAMLphp enviará informes de error generados automáticamente a la dirección de correo electrónico que especifique. Localice la siguiente sección:

      /var/simplesamlphp/config/config.php

      . . .
      'technicalcontact_name'     => 'Administrator',
      'technicalcontact_email'    => 'na@example.org',
      . . .
      

      Sustituya Administrator y na@example.org por los valores apropiados.

      A continuación, configure la zona horaria que desea usar. Localice esta sección:

      /var/simplesamlphp/config/config.php

      . . .
      'timezone' => null,
      . . .
      

      Sustituya null por una zona horaria preferida de esta lista de zonas horarias para PHP. Asegúrese de poner el valor entre comillas:

      /var/simplesamlphp/config/config.php

      . . .
      'timezone' => 'America/New_York',
      . . .
      

      Guarde y cierre el archivo. Con esto, debería poder acceder al sitio en su navegador visitando https://your_domain/simplesaml. Verá la siguiente pantalla en su navegador:

      Interfaz web de simplesaml

      Para asegurarse de que su instalación de PHP cumpla con todos los requisitos para que SimpleSAMLphp se ejecute sin problemas, seleccione la pestaña Configuration y haga clic en el enlace Login as administrator. A continuación utilice la contraseña del administrador que configuró en el archivo de configuración en el Paso 3.

      Una vez que inicie sesión, verá una lista de las extensiones necesarias y opcionales de PHP que utiliza SimpleSAMLphp. Compruebe que haya instalado todas las extensiones, a excepción de predis/predis:

      Todas las extensiones instaladas

      Si falta algún componente necesario, revise este tutorial e instale los componentes que faltan antes de continuar.

      También verá un enlace que dice Sanity check de su configuración de SimpleSAMLphp. Haga clic en este enlace para obtener una lista de los controles aplicados a su configuración para ver si se realizan correctamente.

      Ahora configuraremos una fuente de autenticación para SimpleSAMLphp.

      Paso 4: Configurar la fuente de autenticación

      Ahora que tenemos SimpleSAMLphp instalado y configurado, vamos a configurar una fuente de autenticación para poder autenticar a los usuarios. Usaremos una base de datos MySQL a fin de almacenar una lista de nombres de usuarios y contraseñas con los que se realizará la autenticación.

      Para comenzar, inicie sesión en la cuenta root de MySQL:

      Se le solicitará la contraseña root de la cuenta de MySQL. Facilítela para continuar.

      A continuación, cree una base de datos que funcionará como la fuente de autenticación. La llamaremos auth. Puede llamarla como prefiera:

      • CREATE DATABASE auth DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

      Ahora, crearemos un usuario de MySQL independiente para que funcione exclusivamente en nuestra base de datos auth. Desde un punto de vista de la administración y la seguridad, se recomienda crear bases de datos y cuentas de una función. Llamaremos a nuestro usuario authuser. Ejecute el siguiente comando para crear el usuario, configurar una contraseña y conceder a este acceso a nuestra base de datos auth. Recuerde elegir una contraseña segura para el usuario de su nueva base de datos:

      • GRANT ALL ON auth.* TO 'authuser'@'localhost' IDENTIFIED BY 'your_mysql_auth_user_password';

      Ahora, cree una tabla users que constará de dos campos: username y password. Para mayor seguridad, vamos a usar la función MySQL AES_ENCRYPT() para cifrar la cadena de contraseña de forma que no almacenemos las contraseñas en texto sin formato. Esta función cifra una cadena y muestra una cadena binaria.

      • CREATE TABLE auth.users(username VARCHAR(30), password VARBINARY(30));

      A continuación, inserte tres usuarios en la tabla recién creada. Aquí es donde usaremos la función AES_ENCRYPT() para cifrar los valores del campo de contraseña. Debe proporcionar una cadena que se utilice como clave de cifrado. Asegúrese de sustituir esta cadena con su propia cadena, que puede ser cualquier cadena que desee, siempre y cuando sea compleja.

      • INSERT INTO auth.users(username, password) VALUES
      • ('user1', AES_ENCRYPT('user1pass','your_secret_key')),
      • ('user2', AES_ENCRYPT('user2pass','your_secret_key')),
      • ('user3', AES_ENCRYPT('user3pass','your_secret_key'));

      Utilice la misma clave para cada usuario y asegúrese de recordar la clave para que pueda usarla de nuevo para crear usuarios adicionales en el futuro. También usará esta clave secreta en la configuración de SimpleSAMLphp para poder descifrar las contraseñas y compararlas con las que introduzca el usuario.

      Debemos eliminar los privilegios de modo que la instancia actual de MySQL registre los cambios recientes en el privilegio:

      Salga de la línea de comandos de MySQL escribiendo lo siguiente:

      Para habilitar la funcionalidad del proveedor de identidad en SimpleSAMLphp, debemos editar el archivo /var/simplesamlphp/config/config.php. Existen varias opciones disponibles pero, dado que esta guía se centra en el soporte SAML 2.0, queremos habilitar la opción enable.saml20-idp. Para hacerlo, abra /var/simplesamlphp/config/config.php y habilite el soporte SAML 2.0.

      • nano /var/simplesamlphp/config/config.php

      Localice esta sección del archivo y sustituya false por true:

      /var/simplesamlphp/config/config.php

      ...
      'enable.saml20-idp' => true,
      ...
      

      Guarde el archivo y cierre el editor.

      Ahora que tenemos habilitada la funcionalidad del proveedor de identidad, debemos indicar el módulo de autenticación que se utilizará. Debido a que disponemos de una tabla de usuarios en una base de datos de MySQL, usaremos el módulo de autenticación de SQL. Abra el archivo de configuración authsources:

      • nano /var/simplesamlphp/config/authsources.php

      Localice el siguiente bloque, que está eliminado:

      /var/simplesamlphp/config/authsources.php

      ...
          /*
          'example-sql' => array(
              'sqlauth:SQL',
              'dsn' => 'pgsql:host=sql.example.org;port=5432;dbname=simplesaml',
              'username' => 'simplesaml',
              'password' => 'secretpassword',
              'query' => 'SELECT uid, givenName, email, eduPersonPrincipalName FROM users WHERE uid = :username AND password = SHA2(CONCAT((SELECT salt FROM users WHERE uid = :username), :password),256);',
          ),
          */
      ...
      

      Este código define una conexión con la base de datos y una consulta que SimpleSAMLphp puede usar para buscar un usuario en una tabla de base de datos llamada users. Necesitamos habilitarla y cambiar la consulta para que busque un usuario desde nuestra tabla usando la función AES_DECRYPT() de MySQL. Necesitaremos proporcionar a la función AES_DECRYPT() la misma clave que usamos para cifrar las contraseñas en la consulta.

      Modifique la sección del archivo para especificar los datos de la conexión con la base de datos y la consulta:

      /var/simplesamlphp/config/authsources.php

      ...
          'example-sql' => array(
              'sqlauth:SQL',
              'dsn' => 'mysql:host=localhost;port=5432;dbname=auth',
              'username' => 'authuser',
              'password' => 'your_mysql_auth_user_password',
              'query' => 'SELECT username FROM users WHERE username = :username AND AES_DECRYPT(password,"your_secret_key") = :password',
          ),
      ...
      

      Asegúrese de colocar la clave secreta que especificó en lugar de your_secret_key.

      Guarde y cierre el archivo. Probaremos nuestro proveedor de identidad.

      Paso 5: Probar el proveedor de identidad con la Demo SAML 2.0 SP

      Puede probar la fuente de autenticación que acaba de configurar navegando a la pestaña Authentication y haciendo clic en el enlace Test configured authentication sources (Probar fuentes de autenticación configuradas). Se le presentará una lista de las fuentes de autenticación ya configuradas.

      La lista de fuentes de autenticación configuradas

      Haga clic en example-sql, ya que este es el proveedor que configuró en el paso anterior. Se mostrará una solicitud para introducir un nombre de usuario y contraseña. Introduzca cualquiera de las combinaciones de usuario y contraseña de prueba que insertó en la tabla de usuarios de MySQL. Pruebe user1 con la contraseña user1pass.

      Con un intento correcto, se le presentará la página SAML 2.0 SP Demo Example:

      La página de Demo correcta

      Si no puede iniciar sesión y sabe que la contraseña es correcta, asegúrese de usar la misma clave con la función AES_ENCRYPT() cuando creó el usuario, y con la función AES_DECRYPT() cuando buscó el usuario.

      Ahora puede integrar SimpleSAMLphp con sus propias aplicaciones siguiendo la documentación de la API de SimpleSAMLphp.

      Conclusión

      Ahora tiene la aplicación SimpleSAMLphp debidamente instalada y configurada en su VPS Ubuntu 18.04. SimpleSAMLphp también permite personalizar ampliamente la interfaz de usuario con temas. Puede consultar sus documentos sobre temas para obtener más información.



      Source link

      Cómo usar la extensión PHP PDO para realizar transacciones de MySQL en PHP en Ubuntu 18.04


      El autor seleccionó Open Sourcing Mental Illness para recibir una donación como parte del programa Write for DOnations.

      Introducción

      Una transacción de MySQL es un conjunto de comandos SQL que guardan una relación lógica y se ejecutan en la base de datos como una sola unidad. Las transacciones se utilizan para garantizar el cumplimiento de ACID (atomicidad, consistencia, aislamiento y durabilidad, por su sigla en inglés) en las aplicaciones. Se trata de un conjunto de normas que determinan la confiabilidad de las operaciones de procesamiento de las bases de datos.

      La atomicidad garantiza que las transacciones relacionadas sean correctas o no surtan ningún efecto si se produce un error. La consistencia garantiza la validez de los datos enviados a la base de datos según la lógica de negocios definida. El aislamiento es la correcta ejecución de transacciones simultáneas que garantiza que los efectos de los distintos clientes que se conectan a una base de datos no se afecten entre sí. La durabilidad garantiza que las transacciones con relación lógica se conserven en la base de datos de forma permanente.

      Las instrucciones SQL que se emiten a través de una transacción deben ser correctas fracasar por completo. Si alguna consulta falla, MySQL revierte los cambios y no se confirman en la base de datos.

      Un buen ejemplo para comprender cómo funcionan las transacciones de MySQL es un sitio web de comercio electrónico. Cuando un cliente realiza un pedido, la aplicación inserta registros en varias tablas, por ejemplo, orders y orders_products, dependiendo de la lógica de negocio. Los registros de varias tablas relacionados con un único pedido se deben enviar de forma atómica a la base de datos como una sola unidad lógica.

      Otro caso de uso es una aplicación bancaria. Cuando un cliente transfiere dinero, se envían algunas transacciones a la base de datos. Se debita dinero de la cuenta del remitente y se acredita en la del receptor. Las dos transacciones se deben confirmar de forma simultánea. Si una de ellas falla, la base de datos volverá a su estado original y no se guardarán cambios en el disco.

      En el caso de este tutorial, usará la extensión PHP PDO, que ofrece una interfaz para trabajar con bases de datos en PHP, para realizar transacciones de MySQL en un servidor de Ubuntu 18.04.

      Requisitos previos

      Para comenzar, necesitará lo siguiente:

      Paso 1: Crear una base de datos y tablas de ejemplo

      Primero, creará una base de datos de ejemplo y agregará algunas tablas para comenzar a trabajar con transacciones de MySQL. Primero, inicie sesión en su servidor MySQL como root:

      Cuando se le solicite, introduzca su contraseña root de MySQL y presione INTRO para continuar. Luego, cree una base de datos. En este tutorial, la denominaremos sample_store:

      • CREATE DATABASE sample_store;

      Verá lo siguiente:

      Output

      Query OK, 1 row affected (0.00 sec)

      Cree un usuario llamado sample_user para su base de datos. Recuerde sustituir PASSWORD por un valor seguro:

      • CREATE USER 'sample_user'@'localhost' IDENTIFIED BY 'PASSWORD';

      Conceda privilegios completos a su usuario para la base de datos sample_store:

      • GRANT ALL PRIVILEGES ON sample_store.* TO 'sample_user'@'localhost';

      Por último, vuelva a cargar los privilegios de MySQL:

      Una vez que cree su usuario, verá el siguiente resultado:

      Output

      Query OK, 0 rows affected (0.01 sec) . . .

      Ahora, con la base de datos y el usuario establecidos, puede crear varias tablas para ver cómo funcionan las transacciones de MySQL.

      Cierre sesión en el servidor de MySQL:

      Una vez que el sistema cierre su sesión, verá el siguiente resultado:

      Output

      Bye.

      Luego, inicie sesión con las credenciales de sample_user que acaba de crear:

      • sudo mysql -u sample_user -p

      Ingrese la contraseña de sample_user y presione INTRO para continuar.

      Pase a sample_store para que sea la base de datos seleccionada:

      Una vez que la seleccione, verá el siguiente resultado:

      Output

      Database Changed.

      A continuación, cree una tabla products:

      • CREATE TABLE products (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50), price DOUBLE) ENGINE = InnoDB;

      Este comando crea una tabla products con un campo denominado product_id. Se utiliza el tipo de datos BIGINT, que puede admitir un valor elevado de hasta 2^63-1. Se utiliza este mismo campo como PRIMARY KEY para identificar productos de forma única. La palabra clave AUTO_INCREMENT indica a MySQL que genere el siguiente valor numérico cuando se insertan nuevos productos.

      El campo product_name es de tipo VARCHAR y puede contener hasta 50 letras o números. En price del producto, se utiliza el tipo de datos DOUBLE para admitir formatos de punto flotante en los precios con números decimales.

      Por último, se utiliza InnoDB como ENGINE porque admite fácilmente las transacciones de MySQL a diferencia de otros motores de almacenamiento, como MyISAM.

      Cuando haya creado su tabla products, verá el siguiente resultado:

      Output

      Query OK, 0 rows affected (0.02 sec)

      A continuación, añada algunos elementos a la tabla products al ejecutar los siguientes comandos:

      • INSERT INTO products(product_name, price) VALUES ('WINTER COAT','25.50');
      • INSERT INTO products(product_name, price) VALUES ('EMBROIDERED SHIRT','13.90');
      • INSERT INTO products(product_name, price) VALUES ('FASHION SHOES','45.30');
      • INSERT INTO products(product_name, price) VALUES ('PROXIMA TROUSER','39.95');

      Verá un resultado similar al siguiente después de cada operación INSERT:

      Output

      Query OK, 1 row affected (0.02 sec) . . .

      Luego, compruebe que se hayan agregado los datos a la tabla products:

      Verá una lista con los cuatro productos que insertó:

      Output

      +------------+-------------------+-------+ | product_id | product_name | price | +------------+-------------------+-------+ | 1 | WINTER COAT | 25.5 | | 2 | EMBROIDERED SHIRT | 13.9 | | 3 | FASHION SHOES | 45.3 | | 4 | PROXIMA TROUSER | 39.95 | +------------+-------------------+-------+ 4 rows in set (0.01 sec)

      A continuación, creará una tabla customers para almacenar información básica sobre los clientes:

      • CREATE TABLE customers (customer_id BIGINT PRIMARY KEY AUTO_INCREMENT, customer_name VARCHAR(50) ) ENGINE = InnoDB;

      Al igual que en la tabla products, se utiliza el tipo de datos BIGINT para customer_id para garantizar que la tabla pueda admitir muchos clientes, hasta 2^63-1 registros. La palabra clave AUTO_INCREMENT aumenta el valor de las columnas cuando se inserta un nuevo cliente.

      Como la columna customer_name acepta valores alfanuméricos, se utiliza el tipo de datos VARCHAR, que tiene un límite de 50 caracteres. Nuevamente, se utiliza InnoDB como ENGINE de almacenamiento para admitir las transacciones.

      Después de ejecutar el comando anterior para crear la tabla customers, verá el siguiente resultado:

      Output

      Query OK, 0 rows affected (0.02 sec)

      Agregará tres clientes de ejemplo a la tabla. Ejecute el siguiente comando:

      • INSERT INTO customers(customer_name) VALUES ('JOHN DOE');
      • INSERT INTO customers(customer_name) VALUES ('ROE MARY');
      • INSERT INTO customers(customer_name) VALUES ('DOE JANE');

      Una vez que haya agregado los clientes, verá un resultado similar al siguiente:

      Output

      Query OK, 1 row affected (0.02 sec) . . .

      Luego, verifique los datos de la tabla customers:

      Verá una lista con los tres clientes:

      Output

      +-------------+---------------+ | customer_id | customer_name | +-------------+---------------+ | 1 | JOHN DOE | | 2 | ROE MARY | | 3 | DOE JANE | +-------------+---------------+ 3 rows in set (0.00 sec)

      A continuación, creará una tabla orders para registrar los pedidos de los distintos clientes. Para crear la tabla orders, ejecute el siguiente comando:

      • CREATE TABLE orders (order_id BIGINT AUTO_INCREMENT PRIMARY KEY, order_date DATETIME, customer_id BIGINT, order_total DOUBLE) ENGINE = InnoDB;

      Se utiliza la columna order_id como PRIMARY KEY. El tipo de datos BIGINT le permite ingresar hasta 2^63-1 pedidos que se incrementan de forma automática cada vez que se introduce uno nuevo. El campo order_date contiene la fecha y la hora reales en que se realiza un pedido y, por lo tanto, se utiliza el tipo de datos DATETIME. El campo customer_id se relaciona con la tabla customers que creó anteriormente.

      Verá lo siguiente:

      Output

      Query OK, 0 rows affected (0.02 sec)

      Como el pedido de un cliente puede contener varios elementos, debe crear una tabla orders_products para almacenar esta información.

      Para crear la tabla orders_products, ejecute el siguiente comando:

      • CREATE TABLE orders_products (ref_id BIGINT PRIMARY KEY AUTO_INCREMENT, order_id BIGINT, product_id BIGINT, price DOUBLE, quantity BIGINT) ENGINE = InnoDB;

      Se utiliza ref_id como PRIMARY KEY, que se incrementará automáticamente con cada registro que se ingrese. Los campos order_id y product_id se relacionan con las tablas orders y products respectivamente. La columna price es de tipo DOUBLE para poder admitir valores flotantes.

      El motor de almacenamiento InnoDB debe coincidir con las otras tablas creadas anteriormente, dado que el pedido de un cliente afectará varias tablas que utilizan transacciones en simultáneo.

      Su resultado confirmará la creación de la tabla:

      Output

      Query OK, 0 rows affected (0.02 sec)

      Por el momento, no agregará datos a las tablas orders y orders_products, pero lo hará más adelante utilizando una secuencia de comandos PHP que implementa transacciones de MySQL.

      Cierre sesión en el servidor de MySQL:

      Ahora, su esquema de base de datos está completo y lo completó con algunos registros. Ahora, creará una clase PHP para gestionar las conexiones de la base de datos y las transacciones de MySQL.

      Paso 2: Diseñar una clase PHP para administrar transacciones de MySQL

      En este paso, creará una clase PHP que usará PDO (objetos de datos de PHP) para gestionar transacciones de MySQL. La clase se conectará con su base de datos de MySQL e insertará datos de forma atómica en la base de datos.

      Guarde el archivo de clase en el directorio root de su servidor web de Apache. Para hacerlo, cree un archivo DBTransaction.php con su editor de texto:

      • sudo nano /var/www/html/DBTransaction.php

      Luego, añada el siguiente código al archivo. Reemplace PASSWORD por el valor que creó en el paso 1:

      /var/www/html/DBTransaction.php

      <?php
      
      class DBTransaction
      {
          protected $pdo;
          public $last_insert_id;
      
          public function __construct()
          {
              define('DB_NAME', 'sample_store');
              define('DB_USER', 'sample_user');
              define('DB_PASSWORD', 'PASSWORD');
              define('DB_HOST', 'localhost');
      
              $this->pdo = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASSWORD);
              $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
              $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
          }
      

      Al comienzo de la clase DBTransaction, el PDO utilizará las constantes (DB_HOST, DB_NAME, DB_USER, y DB_PASSWORD) para inicializar la base de datos que creó en el paso 1 y conectarse a ella.

      Nota: Debido a que estamos demostrando transacciones de MySQL en pequeña escala en este tutorial, declaramos las variables de la base de datos en la clase DBTransaction. En un proyecto de producción de gran envergadura, normalmente, crearía un archivo de configuración separado y cargaría las constantes de la base de datos de ese archivo usando la instrucción de PHP require_once.

      A continuación, establezca dos atributos para la clase PDO:

      • ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION: este atributo le indica a PDO que inicie una excepción si se encuentra un error. Los errores se pueden registrar para su depuración.
      • ATTR_EMULATE_PREPARES, false: esta opción desactiva la emulación de las instrucciones preparadas y permite que el motor de la base de datos de MySQL las prepare por su cuenta.

      Ahora, añada el siguiente código a su archivo para crear los métodos de su clase:

      /var/www/html/DBTransaction.php

      . . .
          public function startTransaction()
          {
              $this->pdo->beginTransaction();
          }
      
          public function insertTransaction($sql, $data)
          {
              $stmt = $this->pdo->prepare($sql);
              $stmt->execute($data);
              $this->last_insert_id = $this->pdo->lastInsertId();
          }
      
          public function submitTransaction()
          {
              try {
                  $this->pdo->commit();
              } catch(PDOException $e) {
                  $this->pdo->rollBack();
                  return false;
              }
      
                return true;
          }
      }
      

      Guarde y cierre el archivo pulsando CTRL + X, Y e INTRO.

      Para trabajar con las transacciones de MySQL, se crean tres métodos principales en la clase DBTransaction: startTransaction, insertTransaction y submitTransaction.

      • startTransaction: este método le indica a PDO que inicie una transacción y desactive la confirmación automática hasta que se emita un comando de confirmación.

      • insertTransaction: este método toma dos argumentos. La variable $sql contiene la instrucción SQL que se ejecutará y la variable $data es una matriz de los datos que se vincularán con la instrucción SQL, dado que se utilizarán instrucciones preparadas. Los datos se pasan como una matriz al método insertTransaction.

      • submitTransaction: este método confirma los cambios de forma permanente en la base de datos al emitir un comando commit(). Sin embargo, si hay un error y las transacciones tienen un problema, el método invoca el método rollBack() para hacer que la base de datos regrese a su estado original en caso de que se produzca una excepción de PDO.

      Su clase DBTransaction inicia una transacción, prepara los diferentes comandos SQL que se ejecutarán y, por último, confirma los cambios en la base de datos de forma atómica si no hay problemas. De lo contrario, la transacción se revierte. Además, la clase le permite obtener el registro order_id que acaba de crear al acceder a la propiedad pública last_insert_id.

      Ahora, la clase DBTransaction está lista para invocarse y utilizarse mediante cualquier código PHP, que se creará a continuación.

      Paso 3: Crear una secuencia de comandos PHP para usar la clase DBTransaction

      Creará una secuencia de comandos PHP que implementará la clase DBTransaction y enviará un conjunto de comandos SQL a la base de datos de MySQL. Simulará el flujo de trabajo de un pedido de un cliente en un carrito de compras en línea.

      Estas consultas SQL afectarán las tablas orders y orders_products. Su clase DBTransaction solo debería permitir cambios en la base de datos si todas las consultas se ejecutan sin errores. De lo contrario, verá un error y se revertirán los cambios que haya intentado implementar.

      Creará un pedido único para el cliente JOHN DOE identificado con la customer_id 1. En el pedido del cliente hay tres artículos diferentes con cantidades distintas de la tabla products. Su secuencia de comandos PHP toma los datos del pedido del cliente y los envía a la clase DBTransaction.

      Cree el archivo orders.php:

      • sudo nano /var/www/html/orders.php

      Luego, añada el siguiente código al archivo:

      /var/www/html/orders.php

      <?php
      
      require("DBTransaction.php");
      
      $db_host = "database_host";
      $db_name = "database_name";
      $db_user = "database_user";
      $db_password = "PASSWORD";
      
      $customer_id = 2;
      
      $products[] = [
        'product_id' => 1,
        'price' => 25.50,
        'quantity' => 1
      ];
      
      $products[] = [
        'product_id' => 2,
        'price' => 13.90,
        'quantity' => 3
      ];
      
      $products[] = [
        'product_id' => 3,
        'price' => 45.30,
        'quantity' => 2
      ];
      
      $transaction = new DBTransaction($db_host, $db_user, $db_password, $db_name);
      

      Creó una secuencia de comandos PHP que inicia una instancia de la clase DBTransaction que creó en el paso 2.

      En esta secuencia de comandos, incluye el archivo DBTransaction.php e inicia la clase DBTransaction. Luego, prepara una matriz multidimensional con todos los productos que el cliente pide a la tienda. También invoca el método startTransaction() para iniciar una transacción.

      A continuación, añada el siguiente código para finalizar su secuencia de comandos orders.php

      /var/www/html/orders.php

      . . .
      $order_query = "insert into orders (order_id, customer_id, order_date, order_total) values(:order_id, :customer_id, :order_date, :order_total)";
      $product_query = "insert into orders_products (order_id, product_id, price, quantity) values(:order_id, :product_id, :price, :quantity)";
      
      $transaction->insertQuery($order_query, [
        'customer_id' => $customer_id,
        'order_date' => "2020-01-11",
        'order_total' => 157.8
      ]);
      
      $order_id = $transaction->last_insert_id;
      
      foreach ($products as $product) {
        $transaction->insertQuery($product_query, [
          'order_id' => $order_id,
          'product_id' => $product['product_id'],
          'price' => $product['price'],
          'quantity' => $product['quantity']
        ]);
      }
      
      $result = $transaction->submit();
      
      if ($result) {
          echo "Records successfully submitted";
      } else {
          echo "There was an error.";
      }
      
      

      Guarde y cierre el archivo pulsando CTRL + X, Y e INTRO.

      El comando que se insertará en la tabla de pedidos se prepara con el método insertTransaction. A continuación, obtenga el valor de la propiedad pública last_insert_id de la clase DBTransaction y úselo como $order_id.

      Una vez que se dispone de una $order_id, se utiliza la identificación única para insertar los artículos del pedido del cliente en la tabla orders_products.

      Por último, invoque el método submitTransaction para confirmar los datos del pedido del cliente en la base de datos si no hay problemas. De lo contrario, el método submitTransaction revertirá los cambios que haya intentado realizar.

      Ahora, ejecute la secuencia de comandos orders.php en su navegador. Ejecute lo siguiente y sustituya your-server-IP por la dirección IP pública de su servidor:

      http://your-server-IP/orders.php

      Verá la confirmación de que los registros se enviaron correctamente:

      Resultado de PHP de la clase de transacciones de MySQL

      Su secuencia de comandos PHP funciona según lo previsto y el pedido y los productos del pedido se enviaron a la base de datos de forma atómica.

      Ejecutó el archivo orders.php en la ventana de un navegador. La secuencia de comandos invocó la clase DBTransaction, que, a su vez, envió los datos de orders a la base de datos. En el siguiente paso, verificará si los registros se almacenaron en las tablas relacionadas de la base de datos.

      Paso 4: Confirmar los entradas en su base de datos

      En este paso, verificará si la transacción del pedido del cliente iniciada desde la ventana del navegador se envió a las tablas de la base de datos según lo previsto.

      Para hacerlo, vuelva a iniciar sesión en su base de datos de MySQL:

      • sudo mysql -u sample_user -p

      Ingrese la contraseña de sample_user y presione INTRO para continuar.

      Pase a la base de datos sample_store:

      Antes de continuar, asegúrese de que la base de datos se haya modificado al confirmar el siguiente resultado:

      Output

      Database Changed.

      Luego, emita el siguiente comando para obtener los registros de la tabla orders:

      Esto mostrará el siguiente resultado en el que se detalla el pedido del cliente:

      Output

      +----------+---------------------+-------------+-------------+ | order_id | order_date | customer_id | order_total | +----------+---------------------+-------------+-------------+ | 1 | 2020-01-11 00:00:00 | 2 | 157.8 | +----------+---------------------+-------------+-------------+ 1 row in set (0.00 sec)

      A continuación, obtenga los registros de la tabla orders_products:

      • SELECT * FROM orders_products;

      Verá un resultado similar al siguiente con una lista de los productos del pedido del cliente:

      Output

      +--------+----------+------------+-------+----------+ | ref_id | order_id | product_id | price | quantity | +--------+----------+------------+-------+----------+ | 1 | 1 | 1 | 25.5 | 1 | | 2 | 1 | 2 | 13.9 | 3 | | 3 | 1 | 3 | 45.3 | 2 | +--------+----------+------------+-------+----------+ 3 rows in set (0.00 sec)

      El resultado confirma que la transacción se guardó en la base de datos y que su clase auxiliar DBTransaction está funcionando según lo previsto.

      Conclusión

      En esta guía, utilizó PDO de PHP para trabajar con transacciones de MySQL. Si bien en este artículo no se abarcan todos los aspectos del diseño de un software de comercio electrónico, se ofreció un ejemplo para usar transacciones de MySQL en sus aplicaciones.

      Para obtener más información sobre el modelo ACID de MySQL, considere consultar la guía InnoDB y el modelo ACID en el sitio web oficial de MySQL. Visite nuestra página de contenido de MySQL para acceder a más tutoriales, artículos y preguntas y respuestas relacionados.



      Source link

      Cómo crear un nuevo usuario habilitado para sudo en CentOS 8 [Inicio rápido]


      Introducción

      El comando sudo ofrece un mecanismo para conceder privilegios de administrador; normalmente solo está disponible para el usuario root para usuarios normales. Esta guía le mostrará cómo crear un nuevo usuario con acceso sudo en CentOS 8, sin tener que modificar el archivo /etc/sudoers de su servidor. Si desea configurar sudo desde un usuario CentOS existente, pase al paso 3.

      Paso 1: Iniciar sesión en su servidor

      Aplique SSH a su servidor como root user:

      • ssh root@your_server_ip_address

      Utilice la dirección IP de su servidor o el nombre de host en lugar de your_server_ip_address.

      Paso 2: Añadir un nuevo usuario al sistema

      Utilice el comando adduser para añadir un nuevo usuario a su sistema:

      Asegúrese de sustituir sammy​​​ con el nombre de usuario que desea crear.​​

      Utilice el comando passwd para actualizar la contraseña del nuevo usuario:

      Recuerde sustituir sammy​​​ con el usuario que ha creado. Se solicitará dos veces la nueva contraseña:

      Output

      Changing password for user sammy. New password: Retype new password: passwd: all authentication tokens updated successfully.

      Paso 3: Añadir el usuario al grupo wheel

      Utilice el comando usermod para agregar el usuario al grupo wheel:

      De nuevo, asegúrese de sustituir sammy​​​ por el nombre de usuario al que desea conceder privilegios sudo. Por defecto, en CentOS, todos los miembros del grupo wheel tienen acceso sudo completo.

      Paso 4: Probar el acceso sudo

      Para probar que los nuevos permisos sudo funcionan, primero utilice el comando su para cambiar desde el usuario root a la nueva cuenta de usuario:

      Como nuevo usuario, verifique que pueda usar sudo anteponiendo sudo al comando que desee ejecutar con privilegios de súper usuario:

      Por ejemplo, puede listar el contenido del directorio /root, al que normalmente solo puede acceder el root user:

      La primera vez que utilice sudo en una sesión, se le solicitará la contraseña de la cuenta de ese usuario. Introduzca la contraseña para continuar:

      Output

      [sudo] password for sammy:

      Nota: Esto no pide la contraseña root. Introduzca la contraseña del usuario sudo no la contraseña root.

      Si su usuario está en el grupo adecuado e introdujo la contraseña correctamente, el comando que emitió con sudo se ejecutará con privilegios root.

      Conclusión

      En este tutorial de inicio rápido hemos creado una cuenta de usuario y la hemos añadido al grupo wheel para permitir acceso sudo. Para obtener información detallada sobre cómo configurar un servidor de CentOS 8, lea nuestro tutorial Configuración inicial para servidores con CentOS 8.



      Source link