2016-09-26 3 views
0

У меня есть следующий сценарий: есть приложение, которое может быть установлено самими клиентами, а не каждый веб-хост обеспечивает доступ к консоли, клиенты должны иметь возможность устанавливать и обновлять приложение через браузер. (По аналогии с процессом обновления данных, например, Piwik)Symfony: миграция таблицы пользователей через браузер

Выполнение команд в конкретных контроллеров не проблема:

// 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'); 
} 

Как только это поле добавлено к объекту пользователя, веб-доступ завершился неудачно, поскольку доктрина пытается извлечь данные из 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