Cakephp html2pdf проблема с аутентификацией - PullRequest
0 голосов
/ 03 февраля 2011

Я новичок в торте, но мне как-то удалось пройти.После того, как я выяснил, что html2pdf - удобный способ создания pdf-документов из Cakephp, я установил html2ps / pdf, и после некоторых незначительных проблем это сработало.Итак, теперь я подхожу к тому, что если я не изменяю свои контроллеры до того, как функция Render будет выглядеть следующим образом:

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-> получает данные, вызывая более или менее представление, но этот процесс не вошел в систему или неДругими словами, не разрешено получать данные, которые я хочу представить в PDF.Так что теперь вопрос в том, как это сделать, не открывая мое приложение для всех.

С наилучшими пожеланиями, cdjw

Ответы [ 4 ]

0 голосов
/ 05 апреля 2013

Вы должны поместить

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

в AppController.а не место, где вы используете сейчас.

function beforeFilter() {
    $this->Auth->allow('download','view');
    ....
}
0 голосов
/ 03 февраля 2011

Вы можете проверить 2 вещи перед рендерингом / просмотром:

  • допустимый сеанс (пользователь вошел в систему)
  • действительный токен безопасности, который вы передаете из действия загрузкив качестве именованного параметра

Для токена безопасности просто составьте длинную случайную строку.

Поскольку файл PDF отображается на том же сервере, токен никогда не будет известен воткройте и обеспечьте достаточную безопасность.

Надеюсь, что это рабочая идея для вас.

0 голосов
/ 15 января 2012

У меня была похожая проблема, и вот как я ее обработал ... Сначала я заметил, что вызов процесса PdfComponent выполнял запрос с того же сервера, поэтому я обманул CakePHP, чтобы разрешить просмотр только для запросов, сделанных с самого сервера .., например:

public function beforeFilter() {
    if ($this->request->params['action']=='view'&&$_SERVER['SERVER_ADDR']==$_SERVER['REMOTE_ADDR']) { // for PDF access
        $this->Auth->allow('view');
    }
}
0 голосов
/ 03 февраля 2011

Редактировать:

Вы можете сделать что-то вроде этого:

 if($this->Session->check('Auth.User')) {
        // do your stuff
 } else {
        // do something else
 }
...