我正在使用 Kohana 编写一个 API。每个外部请求都必须由客户端签名才能被接受。
但是,有时我还需要通过构建Request
对象并调用execute()
. 在这些情况下,签名是不必要的,因为我知道请求是安全的。所以我需要知道请求是内部的,这样我就可以跳过签名检查。
那么有什么方法可以查明请求是否是使用Request
对象手动创建的?
查看 Request 看起来您的新请求将被视为内部请求,但没有设置任何特殊标志来告诉您这一点。看看 Kohana_Request 中的 782 到 832 ……没有什么可以帮助你的。
有了这个,我建议扩展 Kohana_Request_Internal 以添加一个将其显示为内部的标志,并在您需要检查它是否为内部/所有其他时将其拉入您的应用程序。
可以使用请求对象的 is_initial() 方法吗?使用此方法,您可以确定请求是否为子请求。
这就是我最终这样做的方式:我已经覆盖了该Request
对象并is_server_side
为其添加了一个属性。现在,当我创建请求时,我只是将其设置为 true,以便我知道它是在服务器端创建的:
$request = Request::factory($url);
$request->is_server_side(true);
$response = $request->execute();
然后稍后在控制器中接收请求:
if ($this->request->is_server_side()) {
// Skip signature check
} else {
// Do signature check
}
这是application/classes/request.php中被覆盖的请求类:
<?php defined('SYSPATH') or die('No direct script access.');
class Request extends Kohana_Request {
protected $is_server_side_ = false;
public function is_server_side($v = null) {
if ($v === null) return $this->is_server_side_;
$this->is_server_side_ = $v;
}
}
听起来您可以通过设置应用程序可以检查的某种静态变量来轻松解决此问题。如果它不是 FALSE,那么你就知道它是内部的。
也许您正在寻找is_external
方法: http:
//kohanaframework.org/3.2/guide/api/Request#is_external
控制器中的 Kohana 3.3:
$this->request->is_initial()