代码点火器实例和外部库对象:身份验证



我会尽量清楚地解释我的问题。如果没有,请告诉我!

Mywebapp基于Codeigniter。在其中,我做了一个控制器,以显示用户上传的图像。通过这种方式,图像只能由成员或授权人员看到,并且不像在Facebook中那样公开(图像地址只是散列的,但是是公开的)。

我还使用 mpdf 库从网页的内容生成 pdf。要使用它,我在第三方目录中有 mpdf 库。为了能够将其与我的格式一起使用,我将我的 mpdf 库放在库目录(在应用程序目录中)中(只是为了能够从不同的控制器使用它)。我有一个 pdf 控制器,它是从我想生成 pdf 的视图中调用的。

所以这个过程是:我从我的角度调用pdf控制器的一个函数。在这个函数中,我调用我的 mpdf 库的一个函数,该函数创建一个 mpdf 对象(第三方类)并生成 pdf。

pdf 的生成效果很好。我唯一拥有的是图像。我解释道。在我的 html 文档中,图像是这样嵌入的:

<img src="http:localhost/www/myapp/library/image/hashed_name_of_the_image" alt="" />

库控制器的图像功能检索图像并显示它。但是在这个函数中,我可以保护或不保护运行它的访问。例如,强制成为登录用户以查看图像 ( if($this->session->userdata(‘logged’) == true) )。

如果没有限制,则生成的 pdf 将包含图像。酷:)。

但如果我施加限制,它就不会。我知道 mpdf 对象是要求图像函数以显示图像的对象。所以验证失败了。

在调用 pdf 函数之前,我尝试在 CI 实例对象上使用配置参数。例如,将"pdf_conversion"设置为 true 并且转换完成,将其设置回 false。

但它不起作用。当我检查图像函数中的值时,它仍然是错误的......就像配置值不是所有对象的更改,而只是更改了它的pdf对象一样。

有没有办法做我想做的事情???使用配置参数或其他任何!!我想我误解了什么,但不知道是什么!

提前感谢答案巴斯蒂安

你的问题是库"调用"图像函数,它没有登录。因此,您的控制器代码拒绝访问。

您可以执行以下两项操作:

  1. 将生成/获取图像的代码从控制器移动到新库中。 然后从控制器和 PDF 库调用该库。这是首选方法。

  2. 在"图像"操作中,找到一种方法来检查请求是否来自 PDF 库。最好的猜测是在PDF库发送的HTTP标头中查找某些内容。无论如何,这不是很安全,因为HTTP标头可以"伪造"。

题外话:是否有理由从控制器操作而不是直接引用图像文件来服务器图像?

关于解决方案 1 的说明

因此,您将有一个库图像.php如下所示

class Image {
  ...
  function get_image($hash){
    [code for getting the image here]
  }
  ... 
}

在控制器中:

function image($hash) {
  $this->load->library('image');
  if (if($this->session->userdata(‘logged’) == true)) {
    $image = $this->image->get_image($hash);
    [send it to the browser]
  }
}

在 PDF 库中

function export($hash) {
  $ci =& get_instace();
  $ci->load->library('image');
  [do pdf stuff]
  $image = $ci->image->get_image($hash);
  $this->add_image($image);
  [do more pdf stuff]
}

这就是想法,实现的实际细节取决于您。

相关内容

最新更新