it-swarm.com.de

Single Sign On zwischen zwei WordPress-Website

Ich habe zwei WordPress-Website Ex: abc.com und xyz.abc.com (beide sind in WordPress).

ich möchte Single Sign On (SSO) in diese beiden Websites implementieren, ohne Multisite Funktionalität zu verwenden.

1
Kajal Solanki

Angenommen, wir haben zwei Websites, die in Ihrer Frage erwähnt werden - abc.com, xyz.abc.com, und deren Tabellenpräfixe sind - ab_, xy_.

Bedarf

Beide Websites müssen in derselben Domain installiert sein. Beide Websites müssen dieselbe Datenbank mit unterschiedlichen Tabellenpräfixen gemeinsam nutzen. Beide Websites müssen Benutzertabellen gemeinsam nutzen (z. B. ab_users, ab_usermeta).

Die wp-config.php-Dateien der Websites

Die wp-config.php-Dateien beider Websites sollten identisch sein, mit einer Ausnahme: $table_prefix für abc.com-Website sollte ab_ sein, und für xyz.abc.com sollte xy_ sein. Siehe wp-config.php für abc.com unten:

<?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');

Neue Installationen

Erstellen Sie eine leere Datenbank, die von beiden Installationen verwendet werden soll.

Löschen Sie wp-config.php for abc.com im Stammverzeichnis von abc.com und führen Sie die Installation durch. Melden Sie sich noch nicht auf Ihrer Website an. Notieren Sie sich den Benutzernamen und das Kennwort des Administrators.

Löschen Sie wp-config.php for xyz.abc.com im Stammverzeichnis von xyz.abc.com und führen Sie die Installation durch. Melden Sie sich nicht bei Ihrer neuen Website an.

Erstellen Sie auf beiden Websites den Ordner mu-plugins in /wp-content, falls dieser nicht vorhanden ist.

Erstelle eine fpw-sync-users.php Datei mit folgendem Inhalt:

<?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');

Ziehen Sie die fpw-sync-users.php-Datei in den /wp-content/mu-plugins-Ordner beider Websites.

Ändern Sie die fpw-sync-users.php-Datei für xyz.abc.com, indem Sie Folgendes ersetzen:

$other_prefixes = array(
    'xy_',
);

mit:

$other_prefixes = array(
    'ab_',
);

Ändern Sie die wp-config.php-Dateien für beide Websites, indem Sie die folgenden beiden Definitionen auskommentieren:

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

Alles erledigt. Melden Sie sich bei abc.com an und gehen Sie zu xyz.abc.com. Sie werden auch auf dieser Website eingeloggt sein.

Sie können xy_users- und xy_usermeta-Tabellen aus der Datenbank löschen, da sie nicht mehr verwendet werden.

Bestehende Installationen

Etwas komplizierter wird es, wenn wir uns mit bereits vorhandenen Websites und separaten Datenbanken beschäftigen.

Wichtig : Erstellen Sie eine Sicherungskopie der Dateien wp-config.php und der Datenbanken beider Websites, bevor Sie fortfahren!

Verwenden wir die Datenbank der abc.com-Website als gemeinsam genutzte Datenbank. Wir müssen alle Tabellen (außer users und usermeta) aus der xyz.abc.com-Datenbank exportieren und in die abc.com-Datenbank importieren.

Stellen Sie sicher, dass sich das Tabellenpräfix für die xyz.abc.com-Datenbank vom Tabellenpräfix für die abc.com-Datenbank unterscheidet. Wenn dies nicht der Fall ist, können Sie das folgende Verfahren zum Ändern des Tabellenpräfixes für xyz.abc.com überspringen.

Ändere das Tabellenpräfix für xyz.abc.com: installiere und aktiviere WP Prefix Changer plugin. Führen Sie die Prozedur aus, um das Präfix zu ändern. Deaktivieren und löschen Sie dieses Plugin. Jetzt können Sie Tabellen exportieren/importieren.

Exportieren Sie Tabellen aus der xyz.abc.com-Datenbank und importieren Sie sie in die abc.com-Datenbank. Hierfür können Sie phpMyAdmin oder ein anderes verfügbares Tool verwenden.

Ändern Sie wp-config.php (siehe wp-config.php-Beispiel aus Neuinstallationen Abschnitt) für abc.com, indem Sie die folgenden Definitionen hinzufügen:

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

und

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

Ändern Sie wp-config.php für xyz.abc.com, indem Sie datenbankbezogene Definitionen ersetzen, um sie Ihren gemeinsam genutzten Datenbankwerten anzupassen. Definitionen hinzufügen, Sie haben gerade wp-config.php von abc.com hinzugefügt. Ersetzen Sie die Definitionen Schlüssel und Hashes, um sie mit den Definitionen in wp-config.php für abc.com abzugleichen.

Fügen Sie (wie in Neuinstallationen Abschnitt beschrieben) das fpw-sync-users.php-Synchronisations-Plugin zu den /wp-content/mu-plugins-Ordnern beider Websites hinzu und ändern Sie die Präfixe entsprechend.

Das ist es. Jetzt haben Sie freigegebene Benutzer, die SSO verwenden können.