Динамическое соединение с базой данных Symfony 4 и пользователь FOS - PullRequest
0 голосов
/ 17 декабря 2018

Используя Symfony 4 , мы создаем приложение для нескольких клиентов , где у каждого клиента есть отдельная база данных.Базы данных клиентов создаются автоматически по требованию при создании нового клиента.В ходе этого процесса мы создаем уникальный дополнительный файл .env (для клиента), в котором хранятся учетные данные подключения к базе данных.

У нас есть 2x подключения к базе данных и 2x менеджера сущностей - common & customer.customer Менеджер сущностей по умолчанию.Очевидно, что customer менеджер сущностей сначала не имеет правильных параметров соединения.Мы загружаем дополнительный файл .env соответственно (например, на основе домена) по запросу ядра и соответственно устанавливаем соединение customer и менеджер сущностей:

$connection = $this->entityManager->getConnection();
$connection->close();

$reflectionConn   = new \ReflectionObject($connection);
$reflectionParams = $reflectionConn->getProperty('params');
$reflectionParams->setAccessible(true);

$params             = $reflectionParams->getValue($connection);
$params['dbname']   = $database; // read from the customer specific .env
$params['user']     = $username; // read from the customer specific .env
$params['password'] = $password; // read from the customer specific .env

$reflectionParams->setValue($connection, $params);
$reflectionParams->setAccessible(false);

$this->entityManager = $this->entityManager->create(
    $this->entityManager->getConnection(),
    $this->entityManager->getConfiguration()
);

Это прекрасно работает!

проблема в контексте безопасности (?) - мы используем FosUserBundle, который не может авторизовать пользователей.Я предполагаю, что приведенного выше кода недостаточно, чтобы повлиять на контекст безопасности.

Каким будет правильный способ достижения цели, заключающейся в динамическом соединении с базой данных + авторизации пользователя с использованием стандартного FosUserBundle?

1 Ответ

0 голосов
/ 18 декабря 2018

Проблема вообще не была связана с контекстом безопасности.Проблема (глупая) заключалась в том, что мой прослушиватель запросов к ядру имел приоритет по умолчанию (0), что делало загрузку всей конфигурации клиента и настройку соединения после того, как произошел прослушиватель входа в систему.

Установка его на 512 (должно быть достаточно)включить до SessionListener

...