2016-09-26 3 views
0

Ich habe folgendes Szenario: Es gibt eine App, die von Clients selbst installiert werden kann und da nicht jeder Webhoster Konsolenzugriff bietet, müssen Clients in der Lage sein, die App über Browser zu installieren und zu aktualisieren. (Ähnlich den Update-Prozess von zB Piwik)Symfony: Migration der Benutzertabelle über Browser

Ausführen von Befehlen in bestimmten Controller ist kein Problem:

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

Derzeit kann dieser Weg über die Konfiguration deaktiviert werden, so dass nicht jeder Benutzer der App kann den Start Update, aber nur Admins. (In der Zukunft Route sollte den Zugang zu Admin-Konten begrenzt)

Das Problem kommt ins Spiel, wenn das Hinzufügen Migrationen für die Benutzertabelle:

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

Sobald dieses Feld an die Benutzereinheit hinzugefügt wird, Der Webzugriff schlägt fehl, da die Doktrin versucht, Daten von user.gender abzurufen, um die Kontodaten für den Sitzungs-/Sicherheitskontext zu füllen.

Gibt es eine Möglichkeit, dieses Problem zu umgehen? Ist es möglich, das Abrufen von Daten aus der Benutzertabelle für eine bestimmte Route zu deaktivieren? Oder noch besser, da letzteres nicht funktioniert, wenn eine Authentifizierung benötigt wird, um auf /route zuzugreifen: Ist es möglich, die Sitzungsbehandlung zu veranlassen, nur ein paar Spalten zu holen?

Oder muss ich in der Benutzertabelle nie etwas ändern, wenn ich Updates über Controller bearbeiten muss?

Die aktuellen 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 

Antwort

0

Wie es scheint, dass niemand eine gute Lösung für das hat, habe ich die komplette Firewall für diese Route zu deaktivieren. Dies funktioniert nur so lange, wie keine Authentifizierung verwendet wird (z. B. für Administratorkonten):

security: 
    firewalls: 
    setup: 
     pattern: ^/(update|install) 
     security: false 
Verwandte Themen