Symfony:通过浏览器迁移用户 table
Symfony: migration of user table via browser
我有以下情况:有一个应用程序可以由客户自己安装,并且由于并非每个网站托管商都提供控制台访问权限,因此客户必须能够通过浏览器安装和更新该应用程序。 (类似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()
]);
}
目前,可以通过配置禁用此路由,这样不是应用程序的每个用户都可以启动更新,但只有管理员。 (以后路由访问应该仅限于admin账号)
为用户添加迁移时出现问题 table:
// app/Resources/DoctrineMigrations/Version20160926090600.php
public function up(Schema $schema)
{
$this->addSql('ALTER TABLE `user` ADD `gender` tinyint(1) unsigned NOT NULL DEFAULT 0');
}
一旦将此字段添加到用户实体,Web 访问就会失败,因为 doctrine 会尝试从 user.gender
获取数据以填充会话/安全上下文的帐户数据。
有没有办法绕过这个问题?是否可以禁止从用户 table 获取特定路线的数据?或者甚至更好,因为如果需要身份验证才能访问,后者将不起作用 /route
:是否可以告诉会话处理只获取几列?
或者如果我需要通过控制器处理更新,我是否永远不需要更改用户 table 中的任何内容?
当前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
由于似乎没有人对此有好的解决方案,我不得不为这条特定路线禁用完整的防火墙。这仅在不使用身份验证时有效(例如,对于管理员帐户):
security:
firewalls:
setup:
pattern: ^/(update|install)
security: false
我有以下情况:有一个应用程序可以由客户自己安装,并且由于并非每个网站托管商都提供控制台访问权限,因此客户必须能够通过浏览器安装和更新该应用程序。 (类似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()
]);
}
目前,可以通过配置禁用此路由,这样不是应用程序的每个用户都可以启动更新,但只有管理员。 (以后路由访问应该仅限于admin账号)
为用户添加迁移时出现问题 table:
// app/Resources/DoctrineMigrations/Version20160926090600.php
public function up(Schema $schema)
{
$this->addSql('ALTER TABLE `user` ADD `gender` tinyint(1) unsigned NOT NULL DEFAULT 0');
}
一旦将此字段添加到用户实体,Web 访问就会失败,因为 doctrine 会尝试从 user.gender
获取数据以填充会话/安全上下文的帐户数据。
有没有办法绕过这个问题?是否可以禁止从用户 table 获取特定路线的数据?或者甚至更好,因为如果需要身份验证才能访问,后者将不起作用 /route
:是否可以告诉会话处理只获取几列?
或者如果我需要通过控制器处理更新,我是否永远不需要更改用户 table 中的任何内容?
当前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
由于似乎没有人对此有好的解决方案,我不得不为这条特定路线禁用完整的防火墙。这仅在不使用身份验证时有效(例如,对于管理员帐户):
security:
firewalls:
setup:
pattern: ^/(update|install)
security: false