我最近在Routes.php文件中添加了安全检查,以确保只有应该能够访问图像的人才能访问这些图像。
它可以按预期进行用户交互,但是现在当我生成PDF时,似乎不允许访问获取图像的进程,因此图像无法加载到PDF中。
这是在Blade的PDF文件中访问图像的方式:
<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集成的实际工具。DomPDF在的门面下已在我的应用中注册为服务提供商PDF
。
请记住,这当然不是路径问题,因为在我实施此安全检查之前它就已经起作用了。SO上与此相关的所有问题似乎都源于此。
如何在没有古怪的解决方法的情况下允许PDF进程访问图像?
可能最简单的方法是完全跳过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机制是可以访问并将其添加到自定义流上下文中的一种。您可能需要调整上下文,以获取通过身份验证所需的确切配置。
上下文代码已从PHP file_get_contents()修改而来,标头和cookie munger已从使用PHP curl发送存储在$ _COOKIE global上的cookie取消。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句