programing

2개의 WordPress에서 사용자 공유하기 동일한 서버의 2개 하위 도메인에 설치

lastmoon 2023. 9. 14. 23:27
반응형

2개의 WordPress에서 사용자 공유하기 동일한 서버의 2개 하위 도메인에 설치

저는 test1.abc.com 과 test2.abc.com 과 같은 두 개의 다른 하위 사이트에 두 개의 워드프레스 사이트를 가지고 있습니다. 두 사이트 모두 wp-wp-debug 플러그인이 활성화되어 있고 로그인한 사용자만 사이트를 볼 수 있습니다.우리는 사용자가 한 사이트에 로그인했다면 다른 사이트에 자동으로 로그인해야 하는 시스템을 만들고 싶습니다.

내가 시도하는 것:

어느 정도 검색해 본 결과 두 사이트 모두에 대해 하나의 데이터베이스를 사용해야 한다는 것을 알게 되었습니다.그래서 저는 다음 단계를 수행했습니다.

저는 test2.abc.com 사이트의 전체 데이터베이스를 다운로드하여 모든 접두사 wp_를 wpmo_로 변경하고 전체 데이터베이스에서 교체하여 첫 번째 사이트의 데이터베이스에 업로드했습니다.wp-config에 이 두 줄을 추가했습니다.두 번째 사이트의 php는 두 번째 사이트가 자신의 사이트가 아닌 첫 번째 사이트의 사용자 테이블을 사용해야 한다고 정의합니다.

define('CUSTOM_USERMETA_TABLE', 'wp_usermeta');
define('CUSTOM_USER_TABLE', 'wp_users');

현재 두 번째 사이트는 첫 번째 사이트의 사용자를 사용하고 있으며 첫 번째 사이트의 사용자 정보로 두 번째 사이트에 로그인할 수 있습니다.

다음 문제는 쿠키라서 두 사이트의 wp-config에 이 줄을 추가했습니다.

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

지금 test1.abc.com 에 로그인해보니 test2.abc.com 에 접속하면 로그인을 요구합니다.그것은 쿠키가 첫번째 사이트에서 두번째 사이트로 전달되지 않는다는 것을 의미합니다.그러나 $_COOKIE를 인쇄하려고 했는데 동일한 암호화 값을 제공하지만 두 번째 사이트에서는 사용자가 여전히 자동 로그인을 하지 않습니다.또한 첫번째 사이트로 돌아왔을때 자동 로그아웃이 되었습니다.두 사이트 모두 쿠키와 관련이 있는 것 같고 가깝지만 두 번째 사이트에 자동 로그인하는 목표에는 도달하지 못했습니다.

도와줄 사람?

해결책 :

Mik3lRo 등의 도움으로 이 문제를 해결할 수 있었습니다.저는 같은 문제에 직면한 모든 사람들을 위해 해결책을 올립니다.여기서 이에 대한 단계별 가이드를 확인할 수 있습니다.

1단계: 두 설치에 하나의 데이터베이스를 사용하고, 설치 시간에 두 개의 다른 접두사를 사용하여 두 wp를 설치합니다.

2단계: 무작위로 생성된 비밀 키와 염 또한 wp-config.php 파일에서 동일한지 확인합니다.

3단계: 이 두 줄을 wp-config에 붙여넣습니다.두번째 사이트의 php.

//Share user tables
define('CUSTOM_USER_META_TABLE', 'SITE1_PREFIX_usermeta');
define('CUSTOM_USER_TABLE', 'SITE1_PREFIX_users');

4단계: 쿠키를 이 행들과 공유합니다. (wp-config.wp에 모두 적습니다.)

//Share cookies
define('COOKIE_DOMAIN', '.abc.com');
define('COOKIEHASH', 'aee53c017c29dc0d3ae37253fc8cbfd8');

5단계: 이제 첫번째 사이트에 로그인하면 두번째 사이트에서 자동 로그인이 가능합니다.하지만 두 번째 사이트에서 "이 페이지에 액세스할 권한이 없습니다"라는 오류 메시지가 표시되는 것은 좋은 일입니다.

6단계: 그 이유는 WordPress가 사용자 능력(wp-includes/capabilities.php)을 확인하기 때문에 데이터베이스에 이 능력을 직접 추가하거나(사용자가 적은 경우) 플러그인을 작성하기 위해서입니다.@Mikk3lRo는 이에 대한 플러그인을 댓글로 작성하는데, 이것은 Good입니다.

감사해요.

알겠습니다. 아주 가깝지만 앞으로 해야 할 일이 몇 가지 더 있습니다.

모든 요구 사항은 다음과 같습니다.

  • 서로 다른 접두사를 사용하여 동일한 데이터베이스를 공유합니다. 이 작업을 완료했습니다.는라고 합니다.wp1_,wp2_등등.
  • wp1_users그리고.wp1_usermetatables 이것을 - 를 정확하게이입니다... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .건…CUSTOM_USER_META_TABLE이 가지고 있는 보다 한 더을 더 많이 긋습니다) (당신이 가지고 있는 것보다 더 밑줄을 더 많이 긋습니다.
  • 을 하여 을 사용하여 하위 간 쿠키 공유COOKIE_DOMAIN그리고.COOKIEHASH해냈잖아요-이
  • (보통) 무작위로 생성된 비밀 키와 소금도 동일한지 확인합니다. 여러분이 이런 일을 했다고 쓰지는 않지만, 결과를 보면 여러분이 가지고 있거나 키가 비어 있다고 생각합니다. (좋지는 않지만, 효과는 있을 것입니다.)
  • 당신이 어떤 일을 할 수 있는지 확인해 보세요.prefix_capabilities 사이트의 각 각 의목각의각에한목의rusermeta표 - 아직 필요하다는 것을 깨닫지 못하셨기 때문에 이런 일을 하신 것은 아니라고 생각합니다.

완전한 솔루션:

에 .wp-config.php:

//Share user tables
define('CUSTOM_USER_META_TABLE', 'wp1_usermeta');
define('CUSTOM_USER_TABLE', 'wp1_users');

//Share cookies
define('COOKIE_DOMAIN', '.abc.com');
define('COOKIEHASH', 'aee53c017c29dc0d3ae37253fc8cbfd8');

/**
 * In my case these are not needed - but they may well be if one
 * of the installs is located in a sub-folder. I have not tested
 * this theory though.
 */
//define('COOKIEPATH', '/');
//define('SITECOOKIEPATH', '/');
//define('ADMIN_COOKIE_PATH', '/wp-admin');

//These all need to be identical
define('AUTH_KEY', 'this should be random');
define('SECURE_AUTH_KEY', 'this should also be a random string');
define('LOGGED_IN_KEY', 'one more random string');
define('AUTH_SALT', 'oh my - so many random strings');
define('SECURE_AUTH_SALT', 'salt, salt, salt and no eggs');
define('LOGGED_IN_SALT', 'this is sooooo random');

/**
 * These do not need to be shared - in fact they probably shouldn't be
 * - if they are you could (in theory) do actions on one site that was
 * intended for the other - probably not a very big concern in reality
 */
define('NONCE_KEY', 'these should be random too, but can differ');
define('NONCE_SALT', 'one site has one, the other another');

이 정도면 두 사이트 모두에서 로그인할 수 있지만 목록에 마지막으로 짜증나는 글이 남아 있습니다.

문제는 사용자의 권한("Capability")이 사이트 중 하나에서만 양호하다는 것입니다.meta_key는 사이트의 테이블 접두사 앞에 붙여집니다.구글 검색을 조금 하면 수정을 권장하는 많은 솔루션을 발견할 수 있습니다.wp-includes/capabilities.php일반 접두사를 사용하는 대신 일반 접두사를 사용하는 것을 강력하게 권장합니다! (보안상의 이유가 아니라 업데이트 후에 이 패치/해킹을 해야 하기 때문에...)코어 파일을 수정하는 것은 미친 짓일 뿐입니다.)

이 장애물을 해결하기 위해서는 복제가 필요합니다.wp1_capabilities노를 젓다wp1_usermeta테이블(각 사용자에 대해!), 새로 제공umeta_id테이블 접두사를 대체합니다.wp1_와 함께wp2_에서meta_key기둥.각 사이트별로 이 작업을 수행해야 하므로 다음과 같은 하나의 행이 있습니다.meta_key wp1_capabilities, 와 하나.wp2_capabilities등등.

사이트에 로그인할 사용자가 본인과 친구뿐이라면 pphMyAdmin 같은 것을 통해 수동으로 로그인하면 됩니다. 동적으로 작동하기 위해 필요하다면 작은 플러그인으로 자동화하는 것이 가능합니다(아래 편집 참조).

저는 항상 이 디자인을 싫어했습니다. 테이블 접두사는 테이블 열 안에서 상관이 없습니다!다중 사이트 설치에 필요하다고 생각하지만, 이를 해결할 수 있는 다른 (더 나은) 방법이 있을 것으로 확신합니다.

업데이트: 모든 사이트 간에 사용자 역할을 동기화 상태로 유지하는 플러그인

이 간단한 플러그인은 필요한 행을 복제하여 에 유지합니다.usermeta사용자가 생성되거나 편집될 때 테이블이 업데이트됩니다.

한 가지 주목할 점은 일부 특수 기능/역할이 있기 때문에 다중 사이트 설치에서는 작동하지 않을 수도 있다는 것입니다.나는 이것을 시험해 본적이 없습니다.

특정 사용 사례에 대한 개선이 필요할 수도 있지만(댓글 부탁드립니다), 사용자가 몇 명밖에 되지 않는 제한된 테스트 사례에 대해서는 문제가 없습니다.수천 명의 사용자가 있는 사이트에서는 비효율적이지만, 사용자가 수정된 경우에만 실행되고 업데이트가 필요한 경우에만 실행되기 때문에 이것이 주요 관심사가 될 것 같지는 않습니다.그러나 방금 추가/편집된 사용자를 읽기만 하고 수정하는 것은 비교적 쉽게 조정할 수 있어야 합니다.그러나 첫 번째 실행 시 기존 사용자가 자동으로 중복되지 않기 때문에 초기 설정이 다소 복잡해질 수 있습니다.

폴더 만들기wp-content/plugins/duplicate-caps안에 다음 내용을 넣었습니다.duplicate-caps.php- 그리고 아래에서 활동하는 것을 잊지 마세요.plugins워드프레스 관리자로모든 사이트에 설치해야 합니다.

<?php
/*
Plugin Name: Duplicate Caps
Plugin URI: 
Description: Tiny plugin to duplicate capabilities in a setup where users (and user tables) are shared across more than one install
Author: Mikk3lRo
Version: 0.1
Author URI: 
*/
$dummy = new duplicate_caps();
class duplicate_caps {
    function __construct() {
        add_action('updated_user_meta', array($this, 'update_prefixed_caps'), 10, 2);
        add_action('added_user_meta', array($this, 'update_prefixed_caps'), 10, 2);
        add_action('deleted_user_meta', array($this, 'update_prefixed_caps'), 10, 2);
    }
    function update_prefixed_caps($mid, $object_id) {
        /**
         * Note that $object_id contains the id of the user that was
         * just changed.
         * On a site with many users it would make sense to only
         * get and set information regarding the just-changed user
         * Currently this function corrects roles for all users
         * making sure pre-existing users are duplicated, and keeping
         * the table in sync.
         */
        global $wpdb;
        //Quick and dirty - get all *capabilities rows for all users
        $sql = "SELECT * FROM {$wpdb->usermeta} WHERE `meta_key` LIKE '%capabilities'";
        $results = $wpdb->get_results($sql) or die(mysql_error());

        //Will hold all prefixes (always include our own)
        $prefixes = array($wpdb->prefix);

        //Will grab the existing role for each prefix
        $user_roles = array();

        //Loop our results
        foreach ($results as $result) {
            //Make sure the meta_key looks right, and grab the prefix
            if (preg_match('#^(.*)capabilities$#', $result->meta_key, $matches)) {
                $prefix = $matches[1];

                // Collect prefixes
                $prefixes[] = $prefix;

                //Note the entire row for later use
                $user_roles[$result->user_id][$prefix] = $result;
            }
        }

        //Make sure we only have one of each
        $prefixes = array_unique($prefixes);

        //Loop through the users we found
        foreach ($user_roles as $user_id => $existing_prefixes) {
            if (!isset($existing_prefixes[$wpdb->prefix])) {
                //User was probably just deleted - all rows are deleted by
                //wordpress though, so no cleanup for us :)
            } else {
                //We want all prefixes to obey us (we just created or changed
                //the user, so we want that to affect all sites)
                $desired_role = $existing_prefixes[$wpdb->prefix]->meta_value;

                //Loop through all prefixes
                foreach ($prefixes as $prefix) {
                    //Data to be inserted / updated
                    $cap_data = array(
                        'user_id' => $user_id,
                        'meta_key' => $prefix . 'capabilities',
                        'meta_value' => $desired_role
                    );

                    //If the prefix doesn't exist for this user
                    if (!in_array($prefix, array_keys($existing_prefixes))) {
                        //Actually insert it (user was probably just created)
                        $wpdb->insert($wpdb->usermeta, $cap_data, array('%d', '%s', '%s'));
                    } else if ($desired_role !== $existing_prefixes[$prefix]->meta_value) {
                        //Update it if not already correct (user was probably just edited)
                        $cap_data['umeta_id'] = $existing_prefixes[$prefix]->umeta_id;
                        $wpdb->replace($wpdb->usermeta, $cap_data, array('%d', '%s', '%s', '%d'));
                    }
                }
            }
        }
    }
}

가장 쉬운 방법은 워드프레스의 SSO(Single-Sign On) 플러그인 중 하나를 사용하는 것이라고 생각합니다.

여기에 많은 양의 플러그인이 나열되어 있습니다.

그 중 하나를 사용하거나 그 중 하나를 기준으로 인증을 수행할 수 있습니다.

또는 사이트 네트워크를 만들 수 있는 멀티 사이트가 있습니다. 멀티 사이트를 만들기로 결정한 경우 먼저 이 내용을 읽어보십시오.

쿠키 정의는 wp 사이트에 로그인하기에 충분하지 않다고 생각합니다.

그래서 제 해결책은 플러그인을 만들어 사이트 중 하나에 로그인하지 않는 사람들의 접근을 제한하는 것입니다.사용자가 사이트 중 하나에 로그인할 때 쿠키를 설정합니다.사용자가 사이트를 볼 때.쿠키 값을 확인하고 사이트로 리디렉션 또는 돌아갑니다.

샘플 코드:

 add_action('wp_login','prefix_set_cookie'); //when someone logged in this call the set_cookie function

 function prefix_set_cookie(){
    setcookie('hashed_cookie','my_value'); //set the cookie

 }

 //call check_cookie function when wordpress site loads
 add_action('wp','check_cookie');

 function check_cookie(){
    //check the cookie value and view the website
    if(isset($_COOKIE['hashed_cookie'] )){
        if($_COOKIE['hashed_cookie'] == 'my_value'){
         return;            
        }else{
            die("no access please login <a href='your login link'>LINK</a>");
        }
    }
 }

이 플러그인의 주된 단점은 보안이 허술하다는 것입니다.누구든지 수동으로 이 쿠키를 만들 수 있으므로 보안이 높은 쿠키이므로 사용하지 마십시오.쿠키가 수동으로 쉽게 생성되지 않도록 가능한 한 해쉬를 시도합니다.

( 플러그인에 대한 전체 코드를 원한다면 어딘가에 놓아둘 것입니다)

업데이트(전체 플러그인):

<?php
/*
Plugin Name: Restrict Access
Author: Pasindu Jayawardane
Description: This Plugin Restrict Access to the Site without login
Author URI: https://www.facebook.com/pj.pasiya
*/

 $key = hash('md5','restrict_access');
 $value = hash('md5','true');

 add_action('wp_login','es_set_cookie');

 function es_set_cookie(){
    global $key, $value;

    setcookie($key, $value ,time()+3600);

 }

 add_action('wp_logout','es_remove_cookie');

 function es_remove_cookie(){
    global $key, $value;

    setcookie($key, $value ,time()-3600);
 }

 add_action('wp','es_check_cookie');

 function es_check_cookie(){
    global $key, $value;

    if(isset($_COOKIE[$key] )){
        if($_COOKIE[$key] == $value){
         return;            
        }else{
            ?>
            <h1 class="alert alert-danger">
                This Website is Protected! <small>You Must Login to See the Website</small>
            </h1>
            <p class="ra-login"> <a href="<?php echo wp_login_url(); ?>"> Login </a> <p>
        <?php

            die();
        }
    }else{
        ?>
        <h1 class="alert alert-danger">
            This Website is Protected! <small>You Must Login to See the Website</small>
        </h1>
        <p class="ra-login"> <a href="<?php echo wp_login_url(); ?>"> Login </a> <p>
        <?php

        die();
    }
 }

워드프레스 설치 플러그인 디렉토리({wp install folder})->wp-content->플러그인으로 이동하여 확장자 .php{file-content->플러그인 새 파일을 만듭니다.php}}: 이 코드를 복사하여 붙여넣기

두 사이트 모두에 대해 이 작업 수행

워드프레스 플러그인으로 이동하여 플러그인을 활성화합니다.(두 사이트 모두)

사이트 중 하나에 로그인하면 두 사이트 중 하나를 볼 수 있습니다.한 사이트를 로그아웃하면 해당 사이트에 로그인할 수 있는 링크가 포함된 메시지가 나타납니다.

(활성화 후 로그아웃하고 사이트에 로그인만 하면 됩니다)

코드도 이메일로 보내드리겠습니다.

언급URL : https://stackoverflow.com/questions/30952936/sharing-user-on-2-wordpress-installs-in-2-sub-domains-on-same-server

반응형