좋아, 이건 좀 복잡해. 그러니 나와 곰.PHPBB3 인증을 사용하여 Zend2 애플리케이션을 통합하는 올바른 방법은 무엇입니까?
저는 얼마 전 PHPBB 포럼을 운영하고 있습니다. 제 목표는 완전히 새로운 인증 구성 요소를 구축하는 대신 사용자 관리 및 인증 기능을 사용하여 Zend2 PHP 응용 프로그램을 만드는 것입니다. 다시 포럼.
라이브 환경에서 다음 구성 요소가 사용됩니다 : PHPBB3, Zend Framework 2 (최신 안정 버전), Apache, PHP 5.6 이상, MySQL은 루트 액세스없이 가상 Linux 서버에서 실행됩니다.
내 개발 환경 (아래의 모든 예제를 실행하는)입니다 : PHPBB3는, 젠드 프레임 워크 2 (최신 안정), XAMPP 3.2.2, Xdebug는과 PHP 5.6.21 활성화, MariaDB는
윈도우 8에서 실행 이미 프레임 워크를 사용하지 않고 직접 아약스를 통해 PHP를 호출을 포함하여 성공을 거두었습니다
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();
을,하지만 지금 - 젠드이 프레임 워크를 사용하여 : PHPBB의 통합이 다음 줄을 요청 할 때마다 필연적으로 검색에 올려 - n을 포함 할 때 여러 가지 문제가 발생합니다. ative PHPBB3 코드.
필자는 경험 많은 PHP 프로그래머가 아니며 지금은 며칠 동안 젠드에 대해 배우고있다. 젠드 신청 전에 위의 코드를 통합하는 중심
내 첫 번째 시도는 Zends index.php
에서 호출됩니다
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를 호출이 초기에 보인다
....
// 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();
....
이 오류가 발생합니다 엉망진창 젠드, 다른 구현 방법에 대해서 나쁘게 생각해.
내가 선호하는 디자인에는 PHPBB 인증을 처리하고 모든 경로와 해당 컨트롤러의 서비스로 사용할 수있는 별도의 인증 젠드 모듈이 포함됩니다. 그러나 phpbb 스크립트를 포함하고 호출하는 것은 아마도 전역 적으로 많이 사용하는 것과 관련된 여러 가지 문제를 일으킬 수 있습니다. 여기
몇 가지 예를 상기 PhpbbAuthController
에서 checkAction
의 코드 : 그것으로 디버깅 후 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
을 실행에서 여기
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);
}
그리고 오류가 보였다 그 $ 요청에 대한 모든 참조 및 해당 인증 함수 내에서 $ symfony_request는 NULL입니다.
젠드 컨텍스트에서 스크립트를 실행하는 방법을 식별하는 데 많은 시간을 허비 한 후에는 별도의 컨텍스트에서 스크립트를 실행하는 방식으로 눈을 떴습니다. 내 마음에 가장 쉬운 방법은 HttpClient
에서 스크립트를 호출하고 결과 텍스트를 사용하여 인증 서비스를 실행하는 것입니다. 이렇게하려면 호출 된 스크립트에서 세션 쿠키를 검색하여 Zend 응용 프로그램에서 사용할 수 있도록 저장해야합니다.
젠드 프레임 워크를 통해 스크립트를 전송하면 젠드 컨트롤러에서 PHBB 코드를 사용하여 같은 문제가 다시 발생하는 것처럼 보이므로 Zends 라우팅을 사용하여 액세스 할 수 없습니다. http 요청을 사용하고 있기 때문에 스크립트를 공용 디렉토리 나 하위 디렉토리에 저장해야합니다.
그리고 그것이 바로 지금입니다. PHPBB를 사용하는 php 파일에 대한 내부 호출은 독자적으로 작동하지만 HttpClient
(지금은 Zend Controller 클래스에서 사용)은 매회마다 시간 제한을 실행합니다. 여기에서 또 다른 질문으로 공식화했습니다 : Zend 2 Http Client Request times out when requesting php file from localhost/public directory.
나는 당신의 의견, 힌트 및 가능한 아키텍처 또는 심지어 위에서 언급 한 내 문제에 대한 부분 솔루션을 주셔서 감사합니다.
필자가 어떤 상황에서도하고 싶지 않은 것은 이미 PHPBB에 있으며 장기적으로 보안 문제로 이어지는 복잡하지만 입증 된 시스템보다 항상 열악한 내 자신의 인증 및 사용자 관리를 개발하는 것입니다. 젠드 애플리케이션은 포럼이 현재 상황의 핵심이기 때문에 "엑스트라"로 간주됩니다.
시간 내 주셔서 감사 드리며 추가 정보를 요청하십시오. (나는 모든 코드를 포함 할 수 없었고이 시점에서 당신에게 어떤 관련이 있을지 모르겠습니다.)
내가하고 싶은 일을 완전히 벗어난 경우에도 귀하의 의견을 듣고 싶습니다. 내가 처분 할 수있는 자원이 매우 부족합니다. 이는 기존 솔루션을 내 응용 프로그램에 통합하려는 가장 중요한 이유입니다. – elfwyn
내 대답을 아래에서보십시오. 나는 그것이 유용하다고 생각한다. – vpassapera