【发布时间】:2016-06-19 16:12:51
【问题描述】:
好的,这有点复杂,请耐心等待。
我现在运行 PHPBB 论坛已有一段时间了,我的目标是使用其用户管理和身份验证功能创建 Zend2 PHP 应用程序,而不是构建一个全新的授权组件,而后者又需要与论坛同步再次。
以下组件将在实时环境中使用: PHPBB3、Zend Framework 2(最新稳定版)、Apache、PHP 5.6+、MySQL,在没有 root 访问权限的虚拟 Linux 服务器上运行。
我的开发环境(运行以下所有示例)是: PHPBB3、Zend Framework 2(最新稳定版)、XAMPP 3.2.2、启用 xdebug 的 PHP 5.6.21、在 Windows 8 上运行的 MariaDB。
每当要求集成 PHPBB 时,搜索中都会不可避免地出现以下行:
global $phpbb_root_path, $phpEx, $user, $db, $config, $cache, $template;
define('IN_PHPBB', true);
$phpbb_root_path = './forum/phpBB3/'; // this path is from an external example
$phpEx = substr(strrchr(__FILE__, '.'), 1);
$phpBBFile = $phpbb_root_path . 'common.' . $phpEx;
include($phpBBFile);
// Start session management
$user->session_begin();
$auth->acl($user->data);
$user->setup();
我已经取得了成功,包括不使用框架或通过 ajax 直接调用 php 的那些,但现在 - 使用 Zend 2 框架 - 包含原生 PHPBB3 代码时会出现多个问题。
我不得不说我不是一个经验丰富的 PHP 程序员,而且我已经学习 Zend 几天了。
我的第一次尝试集中在在 Zend 中调用 Zend 应用程序之前集成上述代码index.php:
....
// Setup autoloading
require 'init_autoloader.php';
global $phpbb_root_path, $phpEx, $user, $db, $config, $cache, $template;
define('IN_PHPBB', true);
$phpbb_root_path = 'public/forums/';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
$phpBBFile = $phpbb_root_path . 'common.' . $phpEx;
include($phpBBFile);
// Run the application!
Zend\Mvc\Application::init(require 'config/application.config.php')->run();
....
导致这个错误:
可捕获的致命错误:传递给 Zend\Stdlib\Parameters::__construct() 的参数 1 必须是数组类型, 给定对象,在 C:\xampp\htdocs\myZendApp\vendor\zendframework\zend-http\src\PhpEnvironment\Request.php 中调用 在第 72 行并在第 24 行的 C:\xampp\htdocs\myZendApp\vendor\zendframework\zend-stdlib\src\Parameters.php 中定义
所以这么早调用 PHPBB 似乎会以一种糟糕的方式把 Zend 搞砸,我继续进行其他实现。
我最喜欢的设计将包括一个单独的身份验证 Zend 模块,它处理 PHPBB 身份验证,并可作为所有路由及其控制器的服务使用。 然而,包含和调用 phpbb 脚本会导致各种问题,可能与大量使用全局变量有关。
这里是PhpbbAuthController中checkAction的一些示例代码:
public function checkAction(){
global $phpbb_root_path, $phpEx, $user, $db, $config, $cache, $template;
define('IN_PHPBB', true);
$phpbb_root_path = 'public/forums/';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
$phpBBFile = $phpbb_root_path . 'common.' . $phpEx;
include($phpBBFile);
$user->session_begin();
$auth->acl($user->data);
$user->setup();
$response = array();
if ($user->data['user_id'] == ANONYMOUS) {
$response['loginState'] = "logged_out";
} else {
$response['loginState'] = "logged_in";
}
return new ViewModel($response);
}
这里是执行session_begin()的错误
致命错误:在 null 上调用成员函数 header() C:\xampp\htdocs\myZendApp\public\forums\phpbb\session.php 在第 228 行
在对其进行调试之后,似乎所有对 $request 和 $symfony_request 的引用都在那些为 NULL 的身份验证函数中。
在花费大量时间寻找从 Zend 上下文执行脚本的方法之后,我将目光投向了一种在单独的上下文中执行脚本的方法。
我想到的最简单的方法是从HttpClient 调用脚本并使用结果文本来驱动我的身份验证服务。
为此,我需要从调用的脚本中检索会话 cookie 并将其存储以在 Zend 应用程序中使用。
如果我通过 Zend 框架引导脚本,我似乎又遇到了同样的问题(在 Zend 控制器中有 PHBB 代码),所以我不能使用 Zends 路由来访问它们。 由于我使用的是 http 请求,因此我必须将脚本存储在公共目录或其子目录中。
这就是我现在的位置。对使用 PHPBB 的 php 文件的内部调用本身可以正常工作,但我使用的 HttpClient(目前来自 Zend 控制器类)确实每次都会遇到超时,我在这里提出了另一个问题:@ 987654321@.
感谢您的观点、提示和可能的架构,甚至是我上面提到的问题的部分解决方案。
在任何情况下我都不想做的是发明自己的身份验证和用户管理,因为它总是不如 PHPBB 中已经存在的复杂但经过验证的系统,并且从长远来看会导致安全问题。 Zend 应用程序也被认为是“额外的”,因为论坛是该站点的核心,就目前情况而言。
非常感谢您抽出宝贵时间,请询问更多信息。 (我不可能包含所有代码,我不知道此时还有什么与您相关)
【问题讨论】:
-
如果我对自己想做的事情完全偏离轨道,我也希望得到您的反馈。我可以使用的资源非常有限,这是我尝试将现有解决方案合并到我的应用程序中的最紧迫原因。
-
请在下面查看我的答案。我想你会发现它很有用。
标签: php authentication zend-framework2 phpbb3 php-5.6