Cakephp html2pdf auth问题

时间:2011-02-03 03:55:51

标签: cakephp pdf-generation authorization html2pdf

我是新蛋糕,但到目前为止,我已经设法通过。在我发现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

4 个答案:

答案 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');
    ....
}