我最近在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 /会话信息..
我怀疑更改DOMPDF中的任何设置都会对此有所帮助,因为它只是被安全检查阻止了。这是我用于DOMPDF / Laravel integration的实际工具。 DomPDF在我的应用程序的PDF
门面下注册为服务提供商。
请记住,这肯定不是路径问题,因为它在我实施此安全检查之前正在运行。所有与此相关的问题似乎源于此。
如何在没有古怪的解决方法的情况下允许PDF进程访问图像?
答案 0 :(得分:2)
可能最简单的方法是完全跳过HTTP并通过文件系统访问您的文件。
<img src="{{ public_path() . '/image/person/signature }} ">
(我对Laravel不太熟悉,所以也许有人可以清理它。)
这假设图像可以在本地文件系统的公共路径下访问。如果它是一个生成的文件,某些东西无法直接访问,或者可能工作太多(例如,您正在重复使用相同的模板进行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机制是可以访问并添加到自定义流上下文的机制。您可能必须调整上下文以获得通过身份验证所需的确切配置。
从[{3}}修改了上下文代码,并从PHP file_get_contents() and headers修改了cookie munger。