2012-04-07 3 views
3

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

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

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

ответ

1

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

Kohana 3.2 API, Request - is_initial()

0

Может быть, вы ищете is_external метод:
http://kohanaframework.org/3.2/guide/api/Request#is_external

+0

Я видел это свойство, но это не так. Это нужно проверить, поступает ли запрос из-за пределов домена, т. Е. Если http://example.com вызывает http://mydomain.com/someaction, 'is_external' будет правдой. Однако, если я нахожу http://mydomain.com/someaction непосредственно на панели браузера, 'is_external' будет false. Поэтому я не могу использовать его, потому что запрос по-прежнему поступает извне (не напрямую изнутри сервера). –

1

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

1

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

И здесь является переопределены класс запроса в приложений/классов/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; 
    } 

} 
1

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

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

+0

Спасибо за указатели на исходный код. Похоже, что для внутренних запросов свойство 'client' установлено на' new Request_Client_Internal' и 'new Request_Client_External' для внешних запросов. Проделайте некоторые тесты, чтобы убедиться, что они надежны. –

Смежные вопросы