Учетные данные динамической базы данных Symfony

#php #database #symfony #authentication #dynamic

#php #База данных #symfony #аутентификация #динамический

Вопрос:

Можно ли ввести данные для установки пользователя / пароля базы данных в Symfony при запуске приложения (например, phpMyAdmin)?

Я хочу, чтобы мое приложение работало следующим образом :

  • Страница приветствия (только html, без подключения к базе данных, только ввод имени пользователя / пароля БД (например, phpMyAdmin))
  • Пользователь устанавливает имя пользователя / пароль для ввода и нажимает кнопку ok => значения могут быть установлены в запрос / сообщение или сеанс в контроллере на примере
  • Symfony подключает базу данных ко всем приложениям и перенаправляет пользователя на маршрут ‘app_index’

Возможно ли это сделать с помощью Symfony 5?

Здесь мое действие контроллера:

 public function database_login(Request $request, Connection $connection): Response
  {
    if ($request->isMethod('POST') amp;amp; $request->request->has('dbpass')) {
      $dbpass = $request->request->get('dbpass');
      $params = $connection->getParams();
      $params['password'] = $dbpass;

      $connection->__construct($params, $connection->getDriver(), $connection->getConfiguration(), $connection->getEventManager());
      $connection->connect();
      return $this->redirectToRoute('app_index');
    }
    return new Response(
      '<form method="post">
        <input type="password" name="dbpass">
        <button type="submit">OK</button>
      </form>'
    );
  }
 

Новое соединение работает нормально, но оно потеряно после redirecToRoute() выполнения функции.

Можете ли вы мне помочь?

Комментарии:

1. HTTP не имеет состояния. Если вы не сохраните данные для входа в БД где-нибудь, очевидно, что все учетные данные, введенные пользователем, будут потеряны

2. Да, я хочу использовать Session или $config->setParameter вместо запроса, но я не знаю, как использовать его для внедрения в doctrine для всех контроллеров. В документации не объясняется, как ее использовать: S

3. почему бы вам не создать страницу входа и не защитить все маршруты с помощью access_control, если /login ? таким образом, все приложения будут защищены, и вы будете перенаправлены на автоматический вход

4. я хочу, чтобы пользователь мог подключаться к базе данных с помощью своих собственных учетных данных db (например, phpmyadmin)

Ответ №1:

@barbuslex, вы можете сохранять переменные в сеансе.

 $request->getSession()->set('db_login', 'login');
$request->getSession()->set('db_password', 'password');
 

Кроме того, чтобы избежать передачи этих параметров вручную при каждом запросе, вы можете использовать EventListener, например: https://symfony.com/doc/current/event_dispatcher.html#request-events-checking-types

Однако, возможно, вам нужно другое событие, которое запускается ранее. Или поиграйте с «приоритетом» слушателя.

Комментарии:

1. Спасибо! я знаю, как использовать сеанс. Я вижу метод с wrapper_class в dbal obect, но у меня нет доступа к сеансу / запросу в классе ConnectionWrapper: S Я проверю с помощью EventListener, понимаю ли я, как это работает с Doctrine….

2. Вам нужно получить RequestStack в прослушивателе, см. symfony.com/doc/current/service_container/request.html .

3. Спасибо вам! Возможно ли внедрить его в wrapper_class для подключения к базе данных или нет?