0

我是蛋糕的新手,但到目前为止我还是设法通过了。在我发现 html2pdf 是一种从 Cakephp 生成 pdf 文档的便捷方式之后,我安装了 html2ps/pdf 并且在遇到一些小问题后它可以工作。所以现在我要说的是,如果我不修改我的控制器 beforeRender 函数,例如:

function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow('download','view');
}

我只是在我创建的 pdf 中看到我的登录页面。在我的 beforeRender 函数中设置 $this->Auth->allow 值显然会打开每个人在未经授权的情况下获得完美 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->process 调用通过或多或少地调用视图来获取数据,但是该进程没有登录,或者换句话说,没有授权获取我想要呈现到 pdf 中的数据。所以现在的问题是如何通过不向所有人开放我的应用程序来完成它。

最好的问候, cdjw

4

4 回答 4

0

你应该把

$this->Auth->allow('download','view');

在 AppController 里面。而不是你现在使用的地方。

function beforeFilter() {
    $this->Auth->allow('download','view');
    ....
}
于 2013-04-05T13:21:40.593 回答
0

编辑:

你可以这样做:

 if($this->Session->check('Auth.User')) {
        // do your stuff
 } else {
        // do something else
 }
于 2011-02-03T05:43:53.440 回答
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');
    }
}
于 2012-01-15T02:45:40.290 回答
0

您可以在渲染 /view 之前检查两件事:

  • 有效会话(用户已登录)
  • 您从下载操作作为命名参数传递的有效安全令牌

对于安全令牌,只需组成一个长的随机字符串。

由于 PDF 是在同一台服务器上呈现的,因此令牌永远不会公开并提供足够的安全性。

希望这对您来说是一个可行的想法。

于 2011-02-03T17:35:29.820 回答