web-dev-qa-db-fra.com

Authentification unique entre deux sites web wordpress

J'ai deux sites Wordpress Ex: abc.com et xyz.abc.com (les deux sont en wordpress).

je veux implémenter l'authentification unique (SSO) dans ces deux sites Web sans utiliser la fonctionnalité multisite .

1
Kajal Solanki

Supposons que nous avons deux sites Web, mentionnés dans votre question - abc.com, xyz.abc.com, et leurs préfixes de table sont - ab_, xy_.

Exigences

Les deux sites Web doivent être installés dans le même domaine. Les deux sites Web doivent partager la même base de données en utilisant des préfixes de table différents. Les deux sites Web doivent partager des tables d'utilisateurs (par exemple, ab_users, ab_usermeta).

Fichiers wp-config.php des sites Web

Les fichiers wp-config.php des deux sites Web doivent être identiques, à une exception près, $table_prefix pour abc.com site devrait être ab_ et pour xyz.abc.com devrait être xy_. Voir wp-config.php pour abc.com, ci-dessous:

<?php
/**
 * The base configurations of the WordPress.
 *
 * This file has the following configurations: MySQL settings, Table Prefix,
 * Secret Keys, WordPress Language, and ABSPATH. You can find more information
 * by visiting {@link http://codex.wordpress.org/Editing_wp-config.php Editing
 * wp-config.php} Codex page. You can get the MySQL settings from your web Host.
 *
 * This file is used by the wp-config.php creation script during the
 * installation. You don't have to use the web site, you can just copy this file
 * to "wp-config.php" and fill in the values.
 *
 * @package WordPress
 */

// ** MySQL settings - You can get this info from your web Host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'abc'); // change it, to match your installation  

/** MySQL database username */
define('DB_USER', 'abcadmin'); // change it, to match your installation

/** MySQL database password */
define('DB_PASSWORD', 'database pasword here'); // change it, to match your installation

/** MySQL hostname */
define('DB_Host', 'localhost'); // change it, to match your installation

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

/**#@+
 * Authentication Unique Keys and Salts.
 *
 * Change these to different unique phrases!
 * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
 * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
 *
 * @since 2.6.0
 */
define('AUTH_KEY',              'use generated value here');
define('SECURE_AUTH_KEY',       'use generated value here');
define('LOGGED_IN_KEY',         'use generated value here');
define('NONCE_KEY',             'use generated value here');

define('AUTH_SALT',             'use generated value here');
define('SECURE_AUTH_SALT',      'use generated value here');
define('LOGGED_IN_SALT',        'use generated value here');
define('NONCE_SALT',            'use generated value here');

define('COOKIE_DOMAIN',         '.abc.com');
define('COOKIEPATH',            '/');
define('COOKIEHASH',            md5('abc.com'));

/**#@-*/

/**
 * WordPress Database Table prefix.
 *
 * You can have multiple installations in one database if you give each a unique
 * prefix. Only numbers, letters, and underscores please!
 */
$table_prefix  = 'ab_'; // in wp-config.php for xyz.abc.com change it to 'xy_'

/* uncomment these two lines after successful website installation */
// define('CUSTOM_USER_TABLE', 'ab_users');
// define('CUSTOM_USER_META_TABLE', 'ab_usermeta');

/**
 * For developers: WordPress debugging mode.
 *
 * Change this to true to enable the display of notices during development.
 * It is strongly recommended that plugin and theme developers use WP_DEBUG
 * in their development environments.
 */
define('WP_DEBUG', false);

/* That's all, stop editing! Happy blogging. */

/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

Nouvelles installations

Créez une base de données vide à utiliser par les deux installations.

Déposez wp-config.php pour abc.com à la racine de abc.com et effectuez l'installation. Ne vous connectez pas encore à votre site web. Notez le nom d'utilisateur et le mot de passe de l'administrateur.

Déposez wp-config.php pour xyz.abc.com à la racine de xyz.abc.com et effectuez l'installation. Ne vous connectez pas à votre nouveau site web.

Dans les deux sites Web, créez un dossier mu-plugins dans /wp-content, s'il n'existe pas.

Créez un fichier fpw-sync-users.php avec le contenu suivant:

<?php
/*
  Plugin Name: FPW Synchronize Shared Users
  Author: Frank P. Walentynowicz
  Author URI: https://fw2s.com
  Disclaimer: Use at your own risk. No warranty expressed or implied is provided.
 */

// Users synchronization on admin login
function fpw_synchronize_admins_on_admin_login( $user_login, $user ) {
    if ( array_key_exists( 'administrator', $user->caps ) ) {
        global $wpdb;
        $site_prefix = $wpdb->prefix;
        $admins_only = true;

        $other_prefixes = array(
            'xy_',
        );

        $args = array( 
            'fields'    => 'ID',
        );
        if ( $admins_only )
            $args[ 'role' ] = 'administrator';

        $users = get_users( $args );

        foreach ( $users as $id ) {
            $cap = get_user_meta( $id, $site_prefix . 'capabilities', true );

            foreach ( $other_prefixes as $prefix )
                update_user_meta( $id, $prefix . 'capabilities', $cap );
        }
    }
}
add_action( 'wp_login', 'fpw_synchronize_admins_on_admin_login', 10, 2 );

// User synchronization on admin create user
function fpw_synchronize_user_on_admin_register( $id ) {
    $me = wp_get_current_user();
    if ( array_key_exists( 'administrator', $me->caps ) ) {
        $other_prefixes = array(
            'xy_',
        );
        $user = get_user_by( 'id', $id );
        $cap = $user->caps;
        foreach ( $other_prefixes as $prefix )
            update_user_meta( $id, $prefix . 'capabilities', $cap );
    }
}
add_action( 'user_register', 'fpw_synchronize_user_on_admin_register', 10, 1 );

// User synchronization on profile update
function fpw_synchronize_user_on_profile_update( $user_id ) {
    if ( current_user_can( 'edit_user', $user_id ) ) {
        $other_prefixes = array(
            'xy_',
        );
        $cap = array( $_POST[ 'role' ] => true, );
        foreach ( $other_prefixes as $prefix )
            update_user_meta( $user_id, $prefix . 'capabilities', $cap );
    }
 }
add_action('edit_user_profile_update', 'fpw_synchronize_user_on_profile_update');

Déposez le fichier fpw-sync-users.php dans le dossier /wp-content/mu-plugins des deux sites Web.

Modifiez le fichier fpw-sync-users.php pour xyz.abc.com en remplaçant chaque occurrence de:

$other_prefixes = array(
    'xy_',
);

avec:

$other_prefixes = array(
    'ab_',
);

Modifiez les fichiers wp-config.php pour les deux sites Web en supprimant la mise en commentaire de ces deux définitions:

// define('CUSTOM_USER_TABLE', 'ab_users');
// define('CUSTOM_USER_META_TABLE', 'ab_usermeta');

Terminé. Connectez-vous à abc.com et allez à xyz.abc.com. Vous serez également connecté à ce site.

Vous pouvez supprimer les tables xy_users et xy_usermeta de la base de données, car elles ne seront plus utilisées.

Installations existantes

Les choses deviennent un peu plus compliquées lorsque nous traitons avec des sites Web existants, avec des bases de données séparées.

Important : effectuez une sauvegarde des fichiers wp-config.php et des bases de données des deux sites Web avant de poursuivre!

Utilisons la base de données du site Web abc.com comme base de données partagée. Nous devons exporter toutes les tables (à l'exception de users et usermeta) de la base de données xyz.abc.com et les importer dans la base de données abc.com.

Assurez-vous que le préfixe de table pour la base de données xyz.abc.com est différent du préfixe de table pour la base de données abc.com. Si c'est différent, vous pouvez ignorer la procédure suivante de modification du préfixe de table pour xyz.abc.com.

Changer le préfixe de la table pour xyz.abc.com: installer et activer WP Prefix Changer plugin. Exécutez sa procédure pour changer le préfixe. Désactiver et supprimer ce plugin. Vous êtes maintenant prêt pour les tables d'exportation/importation.

Exportez les tables de la base de données xyz.abc.com et importez-les dans la base de données abc.com. Pour cela, vous pouvez utiliser phpMyAdmin ou tout autre outil disponible.

Modifiez wp-config.php (voir l'exemple wp-config.php à partir de Nouvelles installations section) pour abc.com, en ajoutant les définitions suivantes:

define('COOKIE_DOMAIN',         '.abc.com');
define('COOKIEPATH',            '/');
define('COOKIEHASH',            md5('abc.com'));

et

define('CUSTOM_USER_TABLE', 'ab_users');
define('CUSTOM_USER_META_TABLE', 'ab_usermeta');

Modifiez wp-config.php pour xyz.abc.com en remplaçant les définitions liées à la base de données pour correspondre aux valeurs de votre base de données partagée. Ajouter définit, vous venez d'ajouter à wp-config.php de abc.com. Remplacez clés _ et hachages définit pour correspondre à ceux définis dans wp-config.php pour abc.com.

Ajoutez (comme décrit dans Nouvelles installations section) fpw-sync-users.php plug-in de synchronisation aux dossiers /wp-content/mu-plugins des deux sites Web et modifiez ses préfixes en conséquence.

C'est tout. Vous avez maintenant des utilisateurs partagés, qui peuvent utiliser l'authentification unique.

4