以前のバージョンでは、それはあまりうまく行われず、水の下から石が引き出されました。
2012年11月7日に更新。
マイナーなバグ修正
2012年11月13日更新。
ファイル/forum/includes/auth/auth_modx.phpのみが修正されます:
PhpBBバージョン: 3.0.11
MODXバージョン: 2.2.5-pl
サイトフォルダー: /
フォーラムフォルダー: /フォーラム
私のデータベースは異なりますが、すべてがうまくいくように、データベースも使用できます。
承認は
PhpBB認証プラグイン
フォーラムでの承認には、「承認プラグイン」のシステムが使用されます。
認証プラグインを使用するには、次のことを行う必要があります。
1.承認プラグインの名前を考えます。例:modx
2.ファイル/forum/includes/auth/auth_modx.phpを作成します(ファイル名の接尾辞(modx)==プラグイン名)
3.ファイル/forum/includes/auth/auth_modx.phpには、少なくとも1つのlogin_modx関数が必要です(サフィックス==プラグイン名)
4.フォーラムで登録を無効にします。一般->ユーザー登録->登録を無効にします
5.フォーラムの管理パネルで:一般->認証->リストからModxを選択します
ファイルコード/forum/includes/auth/auth_modx.php:
<?php # /forum/includes/auth/auth_modx.php if (!defined('IN_PHPBB')){ exit; } /** * */ function get_user_data(){ // define('MODX_API_MODE', true); require dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php'; // /forum // MODX , , // : set_error_handler(defined('PHPBB_MSG_HANDLER') ? PHPBB_MSG_HANDLER : 'msg_handler'); // if($modx->user->get('id') != 0){ // anonimous $result['username'] = $modx->user->get('username'); $profile = $modx->user->getOne('Profile'); $result['user_email'] = $profile->get('email'); $fields = $profile->get('extended'); $result['user_from'] = (string) $fields['region']; // , NULL, NULL // , : // $result['_______users'] = ____modx; // , MODX, , // : MODX extended region, user_from // validate_session_modx () } return $result; } /** * , . */ function login_modx(){ $auth = get_user_data(); // if (!is_array($auth) || empty($auth)) { return array( 'status' => LOGIN_ERROR_USERNAME, 'error_msg' => 'ACCESS_DIRECTLY_DENIDED', 'user_row' => array('user_id' => ANONYMOUS), ); } global $db; $sql = 'SELECT user_id, username, user_password, user_email, user_from, user_type FROM ' . USERS_TABLE . " WHERE username_clean = '" . $db->sql_escape(utf8_clean_string($auth['username'])) . "'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); if ($row){ foreach($auth as $auK => $auV){ if($row[$auK] != $auV){ // modx ( ) // UPDATE unset($auth['username']); $sql = "UPDATE " . USERS_TABLE . " SET " . $db->sql_build_array('UPDATE', $auth) . " WHERE user_id = '" . $db->sql_escape($row['user_id']) . "'"; $db->sql_query($sql); break; } } $res = array( 'status' => LOGIN_SUCCESS, 'error_msg' => false, 'user_row' => array( 'user_id' => $row['user_id'], 'username' => $row['username'], // 'user_email' => $row['user_email'], // E-mail , 'user_from' => $row['user_from'], 'user_type' => 0, 'group_id' => 2 ) ); return $res; } // , . $res = array( 'status' => LOGIN_SUCCESS_CREATE_PROFILE, 'error_msg' => false, 'user_row' => array( "username" => $auth['username'], // "user_email" => $auth['user_email'], // E-mail , "user_from" => $auth['user_from'], "user_type" => 0, "group_id" => 2 ), ); return $res; } /** * , . */ function autologin_modx(){ $user_row = login_modx(); // if ($user_row['status'] == LOGIN_SUCCESS_CREATE_PROFILE) { global $phpbb_root_path, $phpEx; if (!function_exists('user_add')) { include($phpbb_root_path . 'includes/functions_user.' . $phpEx); } $user_row['user_row']['user_id'] = user_add($user_row['user_row']); } // global $db; $sql = 'SELECT * FROM ' . USERS_TABLE . " WHERE user_id = '" . $db->sql_escape($user_row['user_row']['user_id']) . "'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); return $row; } function logout_modx(){ // modx API define('MODX_API_MODE', true); require dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php'; $modx->getService('error','error.modError'); $modx->runProcessor('/security/logout'); //$modx->cacheManager->refresh(); } function validate_session_modx($locUser){ $auth = get_user_data(); if($locUser['username'] == 'Anonymous'){ if($auth){ return false; }else{ return true; } }else{ // modx, , if(!$auth){ // global $user; $user->session_kill(); $user->session_begin(); }elseif(($auth['username'] != $locUser['username'])){ return false; } return true; } } ?>
フォーラム管理者
承認は
ここで、MODXに管理者ユーザーがおり、フォーラム管理者が同じ管理者名を持っているとします。
問題は、フォーラム管理者が確認できないパスワードを確認する必要があることです。 フォーラムデータベースではなく、MODXでの承認。
したがって、フォーラム管理者のパスワードの追加検証を無効にします。
ファイル:/forum/adm/index.php
// Have they authenticated (again) as an admin for this session? if (!isset($user->data['session_admin']) || !$user->data['session_admin']) { login_box('', $user->lang['LOGIN_ADMIN_CONFIRM'], $user->lang['LOGIN_ADMIN_SUCCESS'], true, false); }
変更先:
// Have they authenticated (again) as an admin for this session? //if (!isset($user->data['session_admin']) || !$user->data['session_admin']) //{ // login_box('', $user->lang['LOGIN_ADMIN_CONFIRM'], $user->lang['LOGIN_ADMIN_SUCCESS'], true, false); //}
後:
if (!$auth->acl_get('a_')) { trigger_error('NO_ADMIN'); }
行を追加:
$user->data['session_admin'] = 1;
ログイン、パスワード回復
ファイル/forum/ucp.phpで、フォーラムの承認フォームを使用して、サイトとフォーラムに同時にログインします。
ケース 'login'の間:とbreak; (包括的):
case 'login': define('MODX_API_MODE', true); require dirname(dirname(__FILE__)) . '/index.php'; $modx->getService('error','error.modError'); set_error_handler(defined('PHPBB_MSG_HANDLER') ? PHPBB_MSG_HANDLER : 'msg_handler'); if($_REQUEST["username"] and $_REQUEST["password"]){ $data = array( 'username' => $_REQUEST["username"], 'password' => $_REQUEST["password"], 'rememberme' => 1, 'login_context' => 'web', ); $response = $modx->runProcessor('/security/login', $data); if ($response->isError()) { trigger_error($response->getMessage()); } } if ($user->data['is_registered']) { redirect(append_sid("{$phpbb_root_path}index.$phpEx")); } login_box(request_var('redirect', "index.$phpEx")); break;
ユーザーがフォーラムデータベースにいなくても、自動的に作成されます。
「パスワードを忘れましたか?」リンクをたどるには、フォーラムでMODXパスワード回復ページ(/forum/ucp.php)にアクセスします。
case 'sendpassword': define('MODX_API_MODE', true); require dirname(dirname(__FILE__)) . '/index.php'; $modx->getService('error','error.modError'); set_error_handler(defined('PHPBB_MSG_HANDLER') ? PHPBB_MSG_HANDLER : 'msg_handler'); $modx->sendRedirect($modx->makeUrl(865,'','','full')); // 865 - ID MODX break;
基礎となる記事:
phpbb 3でのサイトとフォーラムユーザーの統合