Ok, questo è un po 'complicato, quindi abbi pazienza con me.Che cos'è il modo "a" corretto per integrare un'applicazione Zend2 con l'autenticazione PHPBB3?
Sto eseguendo un forum PHPBB da un po 'di tempo e il mio obiettivo è creare un'applicazione PHP Zend2 utilizzando le sue funzionalità di gestione utenti e autenticazione invece di creare un componente di autorizzazione completamente nuovo che a sua volta deve sincronizzarsi con il Forum di nuovo.
I seguenti componenti verranno utilizzati nell'ambiente live: PHPBB3, Zend Framework 2 (ultima versione stabile), Apache, PHP 5.6+, MySQL in esecuzione su un server Linux virtuale senza accesso root.
mio ambiente di sviluppo (l'esecuzione di tutti gli esempi di seguito) è: phpbb3, Zend Framework 2 (ultima versione stabile), XAMPP 3.2.2, PHP 5.6.21 con xdebug abilitato, MariaDB in esecuzione su Windows 8.
Ogni volta che l'integrazione di phpBB è chiesto per le seguenti linee inevitabilmente alzare nelle ricerche:
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();
ho già avuto successo compresi quelli senza l'utilizzo di un quadro o chiamando php direttamente tramite ajax, ma ora - utilizzando Zend Framework 2 - ci sono problemi multipli che emergono quando si include n codice PHPBB3 ativo.
Devo dire che non sono un programmatore PHP esperto e ho imparato a conoscere Zend per un paio di giorni.
Il mio primo tentativo centrata sulla integrazione del codice di cui sopra prima che l'applicazione Zend viene chiamato in Zends 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();
....
Con conseguente questo errore:
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
Quindi chiamando phpBB questo sembra presto per rovinare Zend in modo brutto sono passato ad altre implementazioni.
Il mio design preferito includerebbe un modulo di autenticazione Zend separato che gestisce l'autenticazione PHPBB ed è disponibile come servizio per tutte le rotte e i relativi controller. Includere e chiamare gli script phpbb portano tuttavia a vari problemi probabilmente legati al pesante uso di globals.
Ecco alcuni esempi di codice dal checkAction
nel PhpbbAuthController
:
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);
}
E qui l'errore di eseguire 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
dopo il debug in esso sembrava che tutti i riferimenti alla richiesta $ e $ symfony_request all'interno di quelle funzioni di autenticazione dove NULL.
Dopo aver sprecato molte ore nel discernere un modo per eseguire gli script dal contesto di Zend, ho messo gli occhi su un modo per eseguire gli script in un contesto separato. Il modo più semplice che mi è venuto in mente era chiamare lo script da un HttpClient
e usare il testo Risultato per guidare il mio servizio di autenticazione. Per fare ciò avrei bisogno di recuperare il cookie di sessione dagli script chiamati e memorizzarlo per l'uso nell'applicazione Zend.
Se inserisco gli script in Zend Framework, mi sembra di incappare nuovamente nello stesso problema (avendo il codice PHBB in un controller Zend), quindi non posso utilizzare il routing di Zends per accedervi. Dato che sto usando una richiesta http, devo memorizzare gli script nella directory pubblica o in una sottodirectory.
Ed è qui che sono adesso. La chiamata interna ai file php che usano PHPBB funziona bene da sola, ma il HttpClient
che uso (da una classe Zend Controller per ora) viene eseguito in un timeout ad ogni turno, che ho formulato in un'altra domanda qui: Zend 2 Http Client Request times out when requesting php file from localhost/public directory.
Gradirei le vostre opinioni, suggerimenti e possibili architetture o anche soluzioni parziali ai miei problemi sopra menzionati.
Quello che non voglio fare in nessuna circostanza è inventare la mia autenticazione e gestione utente in quanto sarebbe sempre inferiore al sistema complesso ma collaudato che è già in PHPBB e porta a problemi di sicurezza a lungo termine. Anche l'applicazione Zend è considerata un "Extra" poiché il Forum è il cuore del sito allo stato attuale delle cose.
Grazie mille per il vostro tempo e per favore chiedete ulteriori informazioni. (Non potrei includere tutto il codice e non so cos'altro sarebbe rilevante per te a questo punto)
Se sono completamente fuori pista con quello che voglio fare vorrei anche il vostro feedback. Ho risorse molto limitate a mia disposizione, il che è il motivo più urgente per cercare di incorporare una soluzione esistente nella mia applicazione. – elfwyn
Si prega di vedere la mia risposta qui sotto. Penso che lo troverai utile – vpassapera