Как узнать, является ли запрос Kohana внутренним?

Я пишу API, используя Kohana. Каждый внешний запрос должен быть подписан клиентом, чтобы быть принятым.

Однако мне также иногда нужно выполнять внутренние запросы, создавая объект Request и вызывая execute(). В этих случаях подпись не нужна, так как я знаю, что запрос безопасен. Поэтому мне нужно знать, что запрос был внутренним, чтобы я мог пропустить проверку подписи.

Итак, есть ли способ узнать, был ли запрос создан вручную с использованием объекта Request?


person laurent    schedule 07.04.2012    source источник


Ответы (6)


Можете ли вы использовать метод is_initial() объекта запроса? Используя этот метод, вы можете определить, является ли запрос подзапросом.

API Kohana 3.2, запрос - is_initial()

person user449954    schedule 09.04.2012

Похоже, вы можете легко решить эту проблему, установив какую-то статическую переменную, которую ваше приложение может проверять. Если это не ЛОЖЬ, то вы знаете, что это внутреннее.

person Juan Treminio    schedule 08.04.2012

Вот как я это сделал: я переопределил объект 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;
    }

}
person laurent    schedule 08.04.2012

При просмотре запроса кажется, что ваш новый запрос будет считаться внутренним запросом, но не имеет никаких специальных флагов, которые он устанавливает, чтобы сообщить вам об этом. Посмотрите на 782-832 в Kohana_Request... ничем вам не помочь.

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

person gspatel    schedule 08.04.2012
comment
Спасибо за указатели на исходный код. Похоже, что для внутренних запросов свойство client имеет значение new Request_Client_Internal, а для внешних запросов — new Request_Client_External. Проведу несколько тестов с этим, чтобы увидеть, надежен ли он. - person laurent; 09.04.2012

Возможно, вы ищете метод is_external:
http://kohanaframework.org/3.2/guide/api/Request#is_external

person matino    schedule 07.04.2012
comment
Я видел это свойство, но это другое. Это необходимо для проверки того, поступает ли запрос из-за пределов домена, т. е. если example.com вызывает mydomain.com/someaction, is_external будет true. Однако если я наберу mydomain.com/someaction прямо в строке браузера, is_external будет ложным. Поэтому я не могу его использовать, потому что запрос по-прежнему поступает извне (а не напрямую с сервера). - person laurent; 07.04.2012

Кохана 3.3 в контроллере:

$this->request->is_initial()

http://kohanaframework.org/3.3/guide-api/Request#is_initial

person Daan    schedule 15.05.2015