2016-09-26 8 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'); 
} 

、 doctrineがセッション/セキュリティコンテキストのアカウントデータを入力するためにuser.genderからデータを取得しようとするため、Webアクセスが失敗します。

この問題を回避する方法はありますか?特定のルートのユーザーテーブルからデータを取得できないようにすることはできますか?あるいは、後者の場合は、/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

誰もがそのための良い解決策を持っていないと思われたように、私は、この特定のルートのための完全なファイアウォールを無効にする必要があります。これは、認証が使用されない限り(たとえば、管理者アカウントの場合)のみ機能します:

関連する問題