添加安全检查后 PDF 生成过程无法加载图像(cookie 未通过?)
PDF generation process cannot load images after adding security check (cookies not passing?)
我最近在我的 Routes.php 文件中添加了安全检查,以确保只有应该能够访问图像的人才能访问这些图像。
它按用户交互的预期工作,但现在当我生成 PDF 时,获取图像的过程似乎不允许访问,因此图像无法加载到 PDF 中。
以下是在 PDF 的 Blade 文件中访问图像的方式:
<img src="{{ URL::to('image/person/signature',$person->person_token) }} ">
我正在通过 Facade (URL
) 访问它,但出于某种原因,会话 cookie 似乎没有在此请求中传递,因此它未能通过安全检查。
这里是安全检查:
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()
无效这一事实令人怀疑,表明 cookie/session 信息未被传递..
我怀疑更改 DOMPDF 中的任何设置是否对此有所帮助,因为它只是被安全检查阻止了。这是我用于 DOMPDF / Laravel integration 的实际工具。 DomPDF 在我的应用程序中注册为 PDF
.
门面下的服务提供商
请记住,这肯定不是路径问题,因为它在我实施此安全检查之前就可以正常工作。 SO 上与此相关的所有问题似乎都源于此。
我怎样才能允许 PDF 进程访问图像,而不需要古怪的解决方法?
可能最简单的方法是完全跳过 HTTP 并通过文件系统访问您的文件。
<img src="{{ public_path() . '/image/person/signature }} ">
(我对Laravel不太熟悉,所以也许有人可以清理一下。)
这假定图像可以在本地文件系统的 public 路径下访问。如果它是一个生成的文件,无法直接访问,或者工作量太大(例如,您正在为 Web 和 PDF 生成重复使用相同的模板),那么您将不得不考虑一些更复杂的事情。
所以有点复杂...根据用户的请求创建自定义流上下文并将其传递给 dompdf。例如,如果您使用 cookie 进行身份验证,您可以尝试这样的操作:
$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 and cookie munger from Sending cookies stored on $_COOKIE global using PHP curl 修改的上下文代码。
我最近在我的 Routes.php 文件中添加了安全检查,以确保只有应该能够访问图像的人才能访问这些图像。
它按用户交互的预期工作,但现在当我生成 PDF 时,获取图像的过程似乎不允许访问,因此图像无法加载到 PDF 中。
以下是在 PDF 的 Blade 文件中访问图像的方式:
<img src="{{ URL::to('image/person/signature',$person->person_token) }} ">
我正在通过 Facade (URL
) 访问它,但出于某种原因,会话 cookie 似乎没有在此请求中传递,因此它未能通过安全检查。
这里是安全检查:
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()
无效这一事实令人怀疑,表明 cookie/session 信息未被传递..
我怀疑更改 DOMPDF 中的任何设置是否对此有所帮助,因为它只是被安全检查阻止了。这是我用于 DOMPDF / Laravel integration 的实际工具。 DomPDF 在我的应用程序中注册为 PDF
.
请记住,这肯定不是路径问题,因为它在我实施此安全检查之前就可以正常工作。 SO 上与此相关的所有问题似乎都源于此。
我怎样才能允许 PDF 进程访问图像,而不需要古怪的解决方法?
可能最简单的方法是完全跳过 HTTP 并通过文件系统访问您的文件。
<img src="{{ public_path() . '/image/person/signature }} ">
(我对Laravel不太熟悉,所以也许有人可以清理一下。)
这假定图像可以在本地文件系统的 public 路径下访问。如果它是一个生成的文件,无法直接访问,或者工作量太大(例如,您正在为 Web 和 PDF 生成重复使用相同的模板),那么您将不得不考虑一些更复杂的事情。
所以有点复杂...根据用户的请求创建自定义流上下文并将其传递给 dompdf。例如,如果您使用 cookie 进行身份验证,您可以尝试这样的操作:
$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 and cookie munger from Sending cookies stored on $_COOKIE global using PHP curl 修改的上下文代码。