2016-09-26 3 views
0

다음과 같은 시나리오가 있습니다. 클라이언트 자체에서 설치할 수있는 앱이 있으며 모든 웹 호스트가 콘솔 액세스를 제공하는 것은 아니므로 클라이언트는 브라우저를 통해 앱을 설치하고 업데이트 할 수 있어야합니다. 특정 컨트롤러에서 명령을 실행symfony : 브라우저를 통한 사용자 테이블의 마이그레이션

(예를 들어, Piwik의 업데이트 프로세스와 유사)은 아무 문제가 없다 :

// src/CoreBundle/Controller/UpdateController.php 
public function updateAction() 
{ 
    $application = new Application($this->get('kernel')); 
    $application->setAutoExit(false); 

    $input = new ArrayInput(array(
     'command' => 'doctrine:migrations:migrate', 
     '--no-interaction', 
    )); 

    $output = new BufferedOutput(); 
    $application->run($input, $output); 

    return $this->render('system/update.html.twig', [ 
     'dump' => $output->fetch() 
    ]); 
} 

현재,이 경로가 구성을 통해 비활성화 할 수 있습니다와 같은 응용 프로그램이 아닌 모든 사용자가를 시작할 수 있습니다 업데이트 만 관리자 만. (향후, 경로 액세스가 관리자 계정으로 제한되어야한다)

문제는 활동하기 시작하는 때 사용자 테이블에 대한 추가 마이그레이션 : 즉시이 필드는 사용자 개체에 추가로

// app/Resources/DoctrineMigrations/Version20160926090600.php 
public function up(Schema $schema) 
{ 
    $this->addSql('ALTER TABLE `user` ADD `gender` tinyint(1) unsigned NOT NULL DEFAULT 0'); 
} 

, doctrine은 세션/보안 컨텍스트에 대한 계정 데이터를 채우기 위해 user.gender에서 데이터를 가져 오려고 시도하므로 웹 액세스가 실패합니다.

이 문제를 피하는 방법이 있습니까? 특정 경로에 대해 사용자 테이블에서 데이터를 가져 오지 못하게 할 수 있습니까? 또는 /route에 액세스 할 때 인증이 필요하면 후자의 경우 작동하지 않으므로 더 좋을 것입니다. 몇 가지 열만 가져 오도록 세션을 처리 할 수 ​​있습니까?

컨트롤러를 통해 업데이트를 처리해야하는 경우 사용자 테이블에서 아무 것도 변경하지 않아도됩니까?

현재 security.yml

:

security: 
    providers: 
    appuser: 
     entity: 
     class: CoreBundle:User 
    firewalls: 
    default: 
     anonymous: ~ 
     http_basic: ~ 
     provider: appuser 
    dev: 
     pattern: ^/(_(profiler|wdt)|css|images|js)/ 
     security: false 

답변

0

은 아무도 그것에 대해 좋은 해결책이없는 것 같다 바와 같이,이 특정 경로의 전체 방화벽을 해제해야합니다. 이는 인증이 사용되지 않는 한 (예 : 관리자 계정의 경우) 작동합니다 (예 : 관리자 계정의 경우) :

security: 
    firewalls: 
    setup: 
     pattern: ^/(update|install) 
     security: false 
관련 문제