好的,这有点复杂,所以忍受我.

我现在运行PHPBB论坛一段时间,我的目标是使用其用户管理和身份验证功能创建一个Zend2 程序,而不是建立一个全新的授权组件,从而需要再次与论坛同步.

以下组件将在实时环境中使用:phpbb3,Zend Framework 2(最新版本),Apache,PHP 5.6,在无root访问权限的虚拟Linux服务器上运行的MysqL.

我的开发环境(运行所有示例)是:phpbb3,XAMPP 3.2.2,PHP 5.6.21启用xdebug,MariaDB在Windows 8上运行.

每当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,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();
....

导致此错误:

Catchable Fatal error: Argument 1 passed to Zend\Stdlib\Parameters::__construct() must be of the type array,
object given,called in C:\xampp\htdocs\myZendApp\vendor\zendframework\zend-http\src\PHPEnvironment\Request.PHP
on line 72 and defined in C:\xampp\htdocs\myZendApp\vendor\zendframework\zend-stdlib\src\Parameters.PHP on line 24

所以早点调用PHPBB似乎搞砸了Zend的坏方式,我继续其他的实现.

我喜欢的设计将包括一个单独的身份验证Zend模块,它处理PHPBB身份验证,并可作为所有路由及其控制器的服务使用.
然而,包括和调用PHPbb脚本会导致与全局变量大量使用有关的各种问题.

这里有一些来自PHPbbAuthController中的checkAction的示例代码:

public function checkAction(){
    global $PHPbb_root_path,$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()的错误

Fatal error: Call to a member function header() on null in
C:\xampp\htdocs\myZendApp\public\forums\PHPbb\session.PHP on line 228

调试完成后,似乎所有对$request和$symfony_request的引用都在那些认证函数里面是NULL.

在沉迷了许多小时后,从Zend上下文中挑选出一种执行脚本的方法,我已经设法在一个单独的上下文中执行脚本的方式.
我想到的最简单的方法是从HttpClient调用脚本,并使用结果文本来驱动我的认证服务.
为此,我需要从被调用的脚本中检索会话cookie,并将其存储在Zend应用程序中.

如果我通过Zend Framework引导脚本,我似乎又遇到了同样的问题(在Zend控制器中有PHBB代码),所以我不能使用Zend路由来访问它们.
由于我使用http请求,我必须将脚本存储在公用目录或其子目录中.

那就是我现在的地方.使用PHPBB的PHP文件的内部调用自己工作正常,但是我使用的(从现在的Zend Controller类)的HttpClient在每一个回合都遇到了一个超时,我在另一个问题上写道:Zend 2 Http Client Request times out when requesting php file from localhost/public directory.

我会感谢您的意见,提示和可能的架构,甚至部分解决我上面提到的问题.

在任何情况下我不想做的是发明自己的身份验证和用户管理,因为它总是比已经在PHPBB中的复杂但经过验证的系统更差,并导致长期的安全问题.
此外,Zend应用程序被认为是“Extra”,因为论坛是站点的核心.

非常感谢您的时间,请询问更多信息. (我不可能包括所有的代码,我不知道还有什么会与你在这一点上相关)

PHPBB 3.x基于symfony并使用symfony组件.你引用的帖子是非常过时的.

请看看:
https://github.com/phpbb/phpbb/blob/3.1.x/phpBB/config/auth.yml(容器对phpbb3认证提供程序的定义)

版主在
https://github.com/phpbb/phpbb/blob/master/phpBB/config/default/container/services_auth.yml

https://github.com/phpbb/phpbb/blob/3.1.x/phpBB/phpbb/auth/provider/provider_interface.php(如下图所示)

<?PHP
/**
*
* This file is part of the PHPBB Forum Software package.
*
* @copyright (c) PHPBB Limited <https://www.PHPbb.com>
* @license GNU General Public License,version 2 (GPL-2.0)
*
* For full copyright and license information,please see
* the docs/CREDITS.txt file.
*
*/
namespace PHPbb\auth\provider;
/**
* The interface authentication provider classes have to implement.
*/
interface provider_interface
{
    /**
     * Checks whether the user is currently identified to the authentication
     * provider.
     * Called in acp_board while setting authentication plugins.
     * Changing to an authentication provider will not be permitted in acp_board
     * if there is an error.
     *
     * @return  boolean|string  False if the user is identified,otherwise an
     *                          error message,or null if not implemented.
     */
    public function init();
    /**
     * Performs login.
     *
     * @param   string  $username   The name of the user being authenticated.
     * @param   string  $password   The password of the user.
     * @return  array   An associative array of the format:
     *                      array(
     *                          'status' => status constant
     *                          'error_msg' => string
     *                          'user_row' => array
     *                      )
     *                  A fourth key of the array may be present:
     *                  'redirect_data' This key is only used when 'status' is
     *                  equal to LOGIN_SUCCESS_LINK_PROFILE and its value is an
     *                  associative array that is turned into GET variables on
     *                  the redirect url.
     */
    public function login($username,$password);
    /**
     * Autologin function
     *
     * @return  array|null  containing the user row,empty if no auto login
     *                      should take place,or null if not impletmented.
     */
    public function autologin();
    /**
     * This function is used to output any required fields in the authentication
     * admin panel. It also defines any required configuration table fields.
     *
     * @return  array|null  Returns null if not implemented or an array of the
     *                      configuration fields of the provider.
     */
    public function acp();
    /**
     * This function updates the template with variables related to the acp
     * options with whatever configuraton values are passed to it as an array.
     * It then returns the name of the acp file related to this authentication
     * provider.
     * @param   array   $new_config Contains the new configuration values that
     *                              have been set in acp_board.
     * @return  array|null      Returns null if not implemented or an array with
     *                          the template file name and an array of the vars
     *                          that the template needs that must conform to the
     *                          following example:
     *                          array(
     *                              'TEMPLATE_FILE' => string,*                              'TEMPLATE_VARS' => array(...),*                          )
     *                          An optional third element may be added to this
     *                          array: 'BLOCK_VAR_NAME'. If this is present,*                          then its value should be a string that is used
     *                          to designate the name of the loop used in the
     *                          ACP template file. When this is present,an
     *                          additional key named 'BLOCK_VARS' is required.
     *                          This must be an array containing at least one
     *                          array of variables that will be assigned during
     *                          the loop in the template. An example of this is
     *                          presented below:
     *                          array(
     *                              'BLOCK_VAR_NAME'    => string,*                              'BLOCK_VARS'        => array(
     *                                  'KEY IS UNIMPORTANT' => array(...),*                              ),*                              'TEMPLATE_FILE' => string,*                          )
     */
    public function get_acp_template($new_config);
    /**
    * Returns an array of data necessary to build custom elements on the login
    * form.
    *
    * @return   array|null  If this function is not implemented on an auth
    *                       provider then it returns null. If it is implemented
    *                       it will return an array of up to four elements of
    *                       which only 'TEMPLATE_FILE'. If 'BLOCK_VAR_NAME' is
    *                       present then 'BLOCK_VARS' must also be present in
    *                       the array. The fourth element 'VARS' is also
    *                       optional. The array,with all four elements present
    *                       looks like the following:
    *                       array(
    *                           'TEMPLATE_FILE'     => string,*                           'BLOCK_VAR_NAME'    => string,*                           'BLOCK_VARS'        => array(...),*                           'VARS'              => array(...),*                       )
    */
    public function get_login_data();
    /**
     * Performs additional actions during logout.
     *
     * @param   array   $data           An array corresponding to
     *                                  \PHPbb\session::data
     * @param   boolean $new_session    True for a new session,false for no new
     *                                  session.
     */
    public function logout($data,$new_session);
    /**
     * The session validation function checks whether the user is still logged
     * into PHPBB.
     *
     * @param   array   $user
     * @return  boolean true if the given user is authenticated,false if the
     *                  session should be closed,or null if not implemented.
     */
    public function validate_session($user);
    /**
    * Checks to see if $login_link_data contains all information except for the
    * user_id of an account needed to successfully link an external account to
    * a forum account.
    *
    * @param    array   $login_link_data    Any data needed to link a PHPBB account to
    *                               an external account.
    * @return   string|null Returns a string with a language constant if there
    *                       is data missing or null if there is no error.
    */
    public function login_link_has_necessary_data($login_link_data);
    /**
    * Links an external account to a PHPBB account.
    *
    * @param    array   $link_data  Any data needed to link a PHPBB account to
    *                               an external account.
    */
    public function link_account(array $link_data);
    /**
    * Returns an array of data necessary to build the ucp_auth_link page
    *
    * @param int $user_id User ID for whom the data should be retrieved.
    *                       defaults to 0,which is not a valid ID. The method
    *                       should fall back to the current user's ID in this
    *                       case.
    * @return   array|null  If this function is not implemented on an auth
    *                       provider then it returns null. If it is implemented
    *                       it will return an array of up to four elements of
    *                       which only 'TEMPLATE_FILE'. If 'BLOCK_VAR_NAME' is
    *                       present then 'BLOCK_VARS' must also be present in
    *                       the array. The fourth element 'VARS' is also
    *                       optional. The array,*                       )
    */
    public function get_auth_link_data($user_id = 0);
    /**
    * Unlinks an external account from a PHPBB account.
    *
    * @param    array   $link_data  Any data needed to unlink a PHPBB account
    *                               from a PHPbb account.
    */
    public function unlink_account(array $link_data);
}

您可以实现为您的Zend框架项目创建提供程序的界面.

创建会话后,可以看到提供者如何使用

https://github.com/phpbb/phpbb/blob/master/phpBB/phpbb/session.php#L560

/* @var $provider_collection \PHPbb\auth\provider_collection */
    $provider_collection = $PHPbb_container->get('auth.provider_collection');
    $provider = $provider_collection->get_provider();
    $this->data = $provider->autologin();

确保两个项目都使用相同的Cookie,或者zend也在设置用户登录时的PHPBB Cookie和会话,session_start使用它来查找会话ID:

if ($request->is_set($config['cookie_name'] . '_sid',\PHPbb\request\request_interface::COOKIE) || $request->is_set($config['cookie_name'] . '_u',\PHPbb\request\request_interface::COOKIE))
    {
        $this->cookie_data['u'] = request_var($config['cookie_name'] . '_u',false,true);
        $this->cookie_data['k'] = request_var($config['cookie_name'] . '_k','',true);
        $this->session_id       = request_var($config['cookie_name'] . '_sid',true);

        $SID = (defined('NEED_SID')) ? '?sid=' . $this->session_id : '?sid=';
        $_SID = (defined('NEED_SID')) ? $this->session_id : '';

        if (empty($this->session_id))
        {
            $this->session_id = $_SID = request_var('sid','');
            $SID = '?sid=' . $this->session_id;
            $this->cookie_data = array('u' => 0,'k' => '');
        }
    }
    else
    {
        $this->session_id = $_SID = request_var('sid','');
        $SID = '?sid=' . $this->session_id;
    }

谢谢.

什么是将Zend2应用程序与PHPBB3身份验证集成在一起的正确方法?的更多相关文章

  1. html5录音功能实战示例

    这篇文章主要介绍了html5录音功能实战示例的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. HTML5 Web缓存和运用程序缓存(cookie,session)

    这篇文章主要介绍了HTML5 Web缓存和运用程序缓存(cookie,session),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. 基于 HTML5 WebGL 实现的医疗物流系统

    物联网( IoT ),简单的理解就是物体之间通过互联网进行链接。这篇文章给大家介绍基于 HTML5 WebGL 实现的医疗物流系统,感兴趣的朋友跟随小编一起看看吧

  4. HTML5页面无缝闪开的问题及解决方案

    这篇文章主要介绍了HTML5页面无缝闪开方案,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 关于h5中的fetch方法解读(小结)

    这篇文章主要介绍了关于h5中的fetch方法解读(小结),fetch身为H5中的一个新对象,他的诞生,是为了取代ajax的存在而出现,有兴趣的可以了解一下

  6. HTML5跳转小程序wx-open-launch-weapp的示例代码

    这篇文章主要介绍了HTML5跳转小程序wx-open-launch-weapp的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  7. iOS Swift上弃用后Twitter.sharedInstance().session()?. userName的替代方案

    解决方法如果您仍在寻找解决方案,请参阅以下内容:

  8. 使用Fabric SDK iOS访问Twitter用户时间线

    我试图在这个问题上挣扎两天.我正在使用FabricSDK和Rest工具包,试图为Twitter使用不同的RestAPIWeb服务.我可以使用具有authTokenSecret,authToken和其他值的会话对象的TWTRLogInButton成功登录.当我尝试获取用户时间线时,我总是得到失败的响应,作为:{“errors”:[{“code”:215,“message”:“BadAuthentic

  9. ios – 如何在Swift中手动为UIWebView设置Cookie

    我需要在swift中为webview设置一个cookie.我找到了一个解决方案,但它是针对objective-c的.如何在Swift中做到这一点?

  10. ios – 如何从Apple Watch调用iPhone上定义的方法

    有没有办法从Watchkit扩展中调用iPhone上的类中定义的方法?根据我的理解,目前在Watchkit和iPhone之间进行本地通信的方法之一是使用NSUserDefaults,但还有其他方法吗?

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部