Symfony прикрыть прямой адрес php-скрипта в security

bars80081

Новичок
суть задачи:

есть прекрасный php-скрипт, который отлично работает сам по себе, так что и трогать не хочется. для использования положил в директорию public и отлично с ним работаешь.
но не хочется, чтобы каждый имел к нему доступ. то есть хочу открыть доступ к нему только авторизованным пользователям.

как?

просто добавление в config/packages/security.yaml

Код:
    security:
        access_control:
            - { path: ^путь_к_директории_с_файлом, role: ROLE_ADMIN }
не работает. не работает даже если путь_к_директории_с_файлом является рабочим роутом. всё равно дайт доступ неавторизованному пользователю.

мне кажется, что всё-таки есть решение по данному вопросу?

источник задачи:
захотелось засунуть на сайт менеджер БД. найти соответствующий бандл не удалось (видимо, не могу задать правильный вопрос гуглу, устал перерывать стотысяч ссылок о создании подключения в БД). зато есть adminer. положил его на сайт и работай. однако, хочется прикрыть его дополнительно силами симфони. к сожалению, adminer не удаётся запихнуть в контроллер. так как ладно, он использует свой вывод, так он ещё сильно манипулирует буфером вывода. и симфони им играется. в итоге не удаётся их заинтегрировать:

PHP:
class PageController extends AbstractController {
    public function indexAction() {
        ob_start();
        $bef = ob_get_clean();
        include_once(__DIR__ . '/../Lib/adminer-4.7.3-mysql.php');
        $html = ob_get_clean();
        return $this->render($html);
    }
всё равно ругается
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at D:\OSPanel\domains\sym3\src\Service\DbadminerBundle\Lib\adminer-4.7.3-mysql.php:503)
в целом, мне всё же хотелось бы получить ответ на вопрос: можно ли прикрыть свободный адрес силами симфони? ведь захочется запихнуть не только админер...

спасибо
 

bars80081

Новичок
http-авторизация не совсем подходит, по той же причине, зачем вообще нужен админер. в идеальной ситуации таких инструментов не нужно. разработка ведётся на локали, а затем выгружается с миграциями на продакшн. админер нужен на случай форс-мажора, когда очередной проект на новом сервере, к которому нет доступа с того ПК, за которым оказываешься, а HTTP-авторизация либо недоступна, либо не хочешь перепоручать в неконтролируемое хранилище пароли и т.п. в таких условиях интегрированный в проект файлменеджер и менеджер БД спасают практически любую ситуацию. потому и хочется всё сделать только силами php.

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

ладно, проехали с ним

по исходной задаче:
однако, от админера отказываться не хочется, так как бандла менеджера БД к своему удивлению не обнаружил. пришлось копать чем же админер конфликтует с симфони.
как оказалось, админер хорошо запускается из контроллера и нормально работает. но стоит положить маршрут в secure, как начинает ругаться. конфликт развивается на том, что админер активно пользуется сессией и манипуляцией буфером вывода. осложняется ещё тем, что ошибки не указывают, что симфони что-то уже отправил, админер ругается как-то сам на себя, что вводит в заблуждение. попытки завернуть админер в функции ob_* не помогли.
когда устал, пришлось делать костыль, причём очень жёсткий.
в исходном файле админера (он там всего один) удаляется session_start(), а также дополнительно сливаются в файлик $_SESSION['translations'] и $_SESSION['translations_version']. а в контроллере уже размещается:

PHP:
$data = file_get_contents($fileSession);
$data = unserialize($data);
$_SESSION['translations'] = $data['translations'];
$_SESSION['translations_version'] = $data['translations_version'];
include_once($fileRecode);
в общем, так и живём.
 

fixxxer

К.О.
Партнер клуба
nginx.conf
Код:
server {
...
    location /internal/adminer/ {
       internal;
       location ~ \.php$ { ... }
   }
}
controller
PHP:
$response->headers->set("X-Accel-Redirect", "/internal/adminer/adminer.php");
 
Сверху