什么是将Zend2应用程序与PHPBB3身份验证集成在一起的正确方法?
好的,这有点复杂,所以忍受我.
我现在运行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! ZendMvcApplication::init(require 'config/application.config.php')->run(); .... 导致此错误:
所以早点调用PHPBB似乎搞砸了Zend的坏方式,我继续其他的实现. 我喜欢的设计将包括一个单独的身份验证Zend模块,它处理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()的错误
调试完成后,似乎所有对$request和$symfony_request的引用都在那些认证函数里面是NULL. 在沉迷了许多小时后,从Zend上下文中挑选出一种执行脚本的方法,我已经设法在一个单独的上下文中执行脚本的方式. 如果我通过Zend Framework引导脚本,我似乎又遇到了同样的问题(在Zend控制器中有PHBB代码),所以我不能使用Zend路由来访问它们. 那就是我现在的地方.使用PHPBB的php文件的内部调用自己工作正常,但是我使用的(从现在的Zend Controller类)的HttpClient在每一个回合都遇到了一个超时,我在另一个问题上写道:Zend 2 Http Client Request times out when requesting php file from localhost/public directory. 我会感谢您的意见,提示和可能的架构,甚至部分解决我上面提到的问题. 在任何情况下我不想做的是发明自己的身份验证和用户管理,因为它总是比已经在PHPBB中的复杂但经过验证的系统更差,并导致长期的安全问题. 非常感谢您的时间,请询问更多信息. (我不可能包括所有的代码,我不知道还有什么会与你在这一点上相关)
PHPBB 3.x基于symfony并使用symfony组件.你引用的帖子是非常过时的.
请看看: 版主在 和 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 phpbbauthprovider; /** * 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 * phpbbsession::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 phpbbauthprovider_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',phpbbrequestrequest_interface::COOKIE) || $request->is_set($config['cookie_name'] . '_u',phpbbrequestrequest_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; } 谢谢. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |