我正在使用Kohana编写一个API。每个外部请求都必须由客户签名才能被接受。如何知道Kohana请求是否是内部请求?
但是,我也有时需要通过构建一个Request
对象并调用来完成内部请求。在这些情况下,签名是不必要的,因为我知道请求是安全的。所以我需要知道该请求是内部的,以便我可以跳过签名检查。
那么有什么方法可以找出请求是否是使用Request
对象手动创建的?
我正在使用Kohana编写一个API。每个外部请求都必须由客户签名才能被接受。如何知道Kohana请求是否是内部请求?
但是,我也有时需要通过构建一个Request
对象并调用来完成内部请求。在这些情况下,签名是不必要的,因为我知道请求是安全的。所以我需要知道该请求是内部的,以便我可以跳过签名检查。
那么有什么方法可以找出请求是否是使用Request
对象手动创建的?
你可以使用请求对象的is_initial()方法吗?使用这种方法,您可以确定请求是否是子请求。
也许你正在寻找is_external
方法:
http://kohanaframework.org/3.2/guide/api/Request#is_external
这听起来像你可以很容易地通过设置某种静态变量您的应用程序可以检查的解决这个问题。如果它不是FALSE,那么你知道它是内部的。
这就是我最终这样做的结果:我已经覆盖了Request
对象并为其添加了is_server_side
属性。
$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
}
在这里,现在,当我创建的要求,我只是让我知道它已经创建的服务器端设置为true在应用/类重写的请求类/ 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;
}
}
通过请求它看起来像新的请求将被视为展望一个内部请求,但没有任何特殊的标志设置告诉你这一点。在Kohana_Request中查看782到832 ...没有什么可以帮助你的。
因此,我建议扩展Kohana_Request_Internal以添加一个标志,将其显示为内部,并在需要检查它是否为内部/所有其他应用程序时将其拉到应用程序中。
感谢您获取源代码的指针。对于内部请求,“client”属性设置为“new Request_Client_Internal”,对于外部请求则设置为“Request_Client_External”。将做一些测试,看看它是否可靠。 – 2012-04-09 01:10:32
的Kohana 3.3控制器:
$this->request->is_initial()
我看到这个属性,但这是不同的。这是为了检查请求是否来自域外 - 即如果http://example.com调用http://mydomain.com/someaction,则is_external将成立。但是,如果我直接在浏览器栏上键入http://mydomain.com/someaction,'is_external'将是错误的。所以我不能使用它,因为请求仍然来自外部(而不是直接来自服务器内)。 – 2012-04-07 07:28:54