我正在使用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