2015-05-17 1 views
3

Недавно я добавил проверку безопасности в файл Routes.php, чтобы обеспечить доступ к этим изображениям только людям, которые должны иметь доступ к изображениям.Процесс создания PDF-файлов не может загружать изображения после добавления проверки безопасности (файлы cookie не проходят?)

Он работает как ожидается для взаимодействия с пользователем, но теперь, когда я создаю PDF-файлы, кажется, что процесс, который получает изображение, не имеет доступа, и поэтому изображение не может загружаться в PDF-формате.

Вот как образ доступен в файле Лезвия для PDF:

<img src="{{ URL::to('image/person/signature',$person->person_token) }} "> 

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

Вот проверка безопасности:

Route::get('image/person/signature/{authToken}',function($authToken){ 
    // This permission checking should actually probably be in the filters file 
    $loggedUser = Auth::user(); 

    $person = Person::getByAuthToken($authToken); 
    if ($person instanceOf Person){ 
     // PDF is getting shut out here 
     if($loggedUser->company_id == $person->company_id || $loggedUser->isAdmin()) { 
      // Processing goes here 
     } else{ 
      die('You are not authorized to perform this function. Your IP address has been logged.'); 
     } 
    } else { 
     die('You are not authorized to perform this function. Your IP address has been logged.'); 
    } 
}); 

Я также попытался добавить следующие условия для проверки безопасности, чтобы разрешить доступ к процессу, который не работал:

  • $loggedUser instanceOf PDF
  • $loggedUser instanceOf ServiceProvider
  • Auth::check()

Тот факт, что Auth::check() не работает подозрительна и будет указывать, что информация куки/сессии не прошло ..

я как-то сомнения, изменения каких-либо настроек в DOMPDF поможет с этим, так как он просто блокируется проверкой безопасности. Вот фактический инструмент, который я использую для DOMPDF/Laravel integration. DomPDF зарегистрирован как поставщик услуг в моем приложении под фасадом PDF.

Помните, что это, конечно, не проблема пути, потому что он работал до того, как я выполнил эту проверку безопасности. Все вопросы, связанные с этим на SO, похоже, вытекают из этого.

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

+1

быстрое быстрое решение. Как насчет проверки запроса IP, используя Request :: getClientIp(), если он находится в «белом списке», разрешает доступ. –

+0

@EzequielMoreno, что, безусловно, интересная идея, и она работает, потому что это внешний IP-сервер, который делает запрос, но, очевидно, его легко сломать, если кто-то обманывает свой IP-адрес, и нет фильтрации пакетов, выполняемой сетью , Спасибо за идею. – Marcel

ответ

2

Возможно, самый простой способ - пропустить HTTP в целом и получить доступ к файлу через файловую систему.

<img src="{{ public_path() . '/image/person/signature }} "> 

(я не слишком хорошо знаком с Laravel, так что, возможно, кто-то может очистить это.)

Это предполагает, что образ доступен под общественным путем в локальной файловой системе. Если это сгенерированный файл, что-то недоступное напрямую или, может быть, слишком много работы (например, вы повторно используете один и тот же шаблон для создания веб-страниц и PDF-файлов), вам придется подумать о чем-то более сложном.


Так что немного сложнее ... создать пользовательский контекст потока из запроса пользователя и передать его в dompdf.Если вы используете, например, куки для аутентификации, вы можете попробовать что-то вроде этого:

$cookie_data = implode(
    "; ", array_map(
    function($k, $v) { 
     return "$k=$v"; 
    }, 
    array_keys($_COOKIE), 
    array_values($_COOKIE) 
) 
); 

$opts = array(
    'http'=>array(
    'method'=>'GET', 
    'header'=>'Cookie: ' . $cookie_data 
) 
); 
$context = stream_context_create($opts); 

$dompdf = new DOMPDF; 
$dompdf->set_http_context($context); 
... 

Я просто принимая удар в темноте здесь (я не должен проверить это делать я?) , Это предполагает, что ваш пользователь запускает рендеринг PDF (похоже, это так) и что механизм AuthN - это тот, к которому можно получить доступ и добавить его в контекст пользовательского потока. Возможно, вам придется настроить контекст, чтобы получить точную конфигурацию, необходимую для прохождения аутентификации.

Контекстный код снят с изменения PHP file_get_contents() and headers и печенье munger от Sending cookies stored on $_COOKIE global using PHP curl.

+0

Самая первая строка вашего ответа может быть просто правильным способом сделать это. Это представление никогда не отображается пользователю и используется только сервером для создания PDF-файлов. Тогда имеет смысл просто исправить это из источника. Я очень ценю ваш ответ, несмотря на то, что вы не знакомы с Laravel. – Marcel

+0

Не стесняйтесь редактировать эту строку, чтобы она предоставляла более точный образец кода (для будущих посетителей). – BrianS

+0

(Возможно, когда-нибудь я проведу аутентификацию.) – BrianS

 Смежные вопросы

  • Нет связанных вопросов^_^