我是新蛋糕,但到目前为止,我已经设法通过。在我发现html2pdf是一种从Cakephp生成pdf文档的方便的方法之后,我已经安装了html2ps / pdf,并且在一些小问题之后它起作用了。所以现在我现在要到了,如果我不修改我的控制器beforeRender功能,如:
function beforeFilter() {
parent::beforeFilter();
$this->Auth->allow('download','view');
}
我刚刚在我创建的pdf中看到了我的登录页面。在我的beforeRender函数中设置$ this-> Auth->允许值显然无法获得完美的pdf而无需授权。整个控制器看起来像这样:
<?php
class DashboardController extends AppController {
var $name = 'Dashboard';
var $uses = array('Aircrafts','Trainingplans',
'Fstds','Flights','Properties','Person');
function beforeFilter() {
parent::beforeFilter();
$this->Auth->allow('download','view');
}
function view() {
/* set layout for print */
$this->layout = 'pdf';
/* change layout for browser */
if> (!isset($this->params['named']['print']))
$this->layout = 'dashboard';
/* aircrafts */
$this->Aircrafts->recursive = 0;
$aircrafts =$this->Aircrafts->find('all');
$this->set('aircrafts',$aircrafts);
.... and so on....
$this->set('person_properties',$person_properties);
}
function download($id = null) {
$download_link = 'dashboard/view/print:1';
// Include Component
App::import('Component', 'Pdf');
// Make instance
$Pdf = new PdfComponent();
// Invoice name (output name)
$Pdf->filename = 'dashboard-' . date("M");
// You can use download or browser here
$Pdf->output = 'download';
$Pdf->init();
// Render the view
$Pdf->process(Router::url('/', true) . $download_link);
$this->render(false);
}
}
?>
所以在我看来,$ Pdf-&gt;进程调用通过调用或多或少的视图获取数据,但是这个进程没有登录,换句话说没有被授权获取我想要呈现的数据进入pdf。所以现在的问题是如何通过不向所有人开放我的应用程序来完成它。
最好的问候,cdjw
答案 0 :(得分:0)
编辑:
你可以这样做:
if($this->Session->check('Auth.User')) {
// do your stuff
} else {
// do something else
}
答案 1 :(得分:0)
您可以在渲染/查看之前检查两件事:
对于安全令牌,只需组成一个长随机字符串。
由于PDF在同一台服务器上呈现,因此永远不会在开放时知道该令牌并提供足够的安全性。
希望这对你有用。
答案 2 :(得分:0)
我有类似的问题,这就是我处理它的方式...... 我首先注意到PdfComponent的进程调用是从同一个服务器发出请求,所以我欺骗CakePHP只允许查看来自服务器本身的请求..像这样:
public function beforeFilter() {
if ($this->request->params['action']=='view'&&$_SERVER['SERVER_ADDR']==$_SERVER['REMOTE_ADDR']) { // for PDF access
$this->Auth->allow('view');
}
}
答案 3 :(得分:0)
你应该把
$this->Auth->allow('download','view');
在AppController中。而不是放在你现在使用的地方。
function beforeFilter() {
$this->Auth->allow('download','view');
....
}