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_usermeta
tables 이것을 - 를 정확하게이입니다... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .건…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
'programing' 카테고리의 다른 글
panda .at vs .loc (0) | 2023.09.14 |
---|---|
IN 절에 변수를 전달하는 방법? (0) | 2023.09.14 |
MariaDB 권한 문제 - [Warning] 사용자 'rphsp'@'raspberrypi.lan'에 대한 액세스가 거부되었습니다. (0) | 2023.09.14 |
Oracle - 리터럴이 형식 문자열 오류와 일치하지 않습니다. (0) | 2023.09.14 |
다른 테이블에 의한 MySQL 사용자 지정 주문 (0) | 2023.09.14 |