#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 для подключения к базе данных или нет?