Доступ к переменной сеанса, установленной в Kohana вне Kohana

Я пытаюсь использовать KCFinder с CKEditor и Kohana. Мне нужно, чтобы каждый пользователь имел доступ к своей отдельной папке загрузки. Для этого я хочу передать идентификатор текущего пользователя в KCFinder. Чтобы сделать это безопасно, я не могу передать его через URL как переменную GET, поэтому мне нужно сделать это через сеанс.

Я попытался установить переменную в Kohana, и когда я var_dump($_SESSION) в Кохане переменная есть. Когда я делаю это в KCFinder, его там нет. Я проверил session_id и заметил, что он меняется от страницы к странице, и поэтому я передал session_id в KCFinder, используя URL-адрес в качестве переменной GET, а затем установите session_id в KCFinder так совпало. Однако переменная все еще не доступна, когда я var_dump($_SESSION),

Вот мое действие Kohana:

public function action_edit()
{
    $this->template->javascripts[] = '/ckeditor/ckeditor.js';
    $_SESSION['KCFINDER']['user_id'] = Auth::instance()->get('id');
    var_dump(session_id(), $_SESSION['KCFINDER']);

    $id = (int)$this->request->param('id');
    $this->layout = Request::factory('document/update/'.$id)->execute()->body();
    $this->template->js_custom .= "var phpsessionid = '".session_id()."';";
}

// document/update action
public function action_update()
{
    $id = (int)$this->request->param('id');
    if ( ! $id)
    {
        throw new HTTP_Exception_400('No document ID was specified. Please go back and try again.');
    }
    $document = ORM::factory('Document', $id);
    if ( ! $document->loaded())
    {
        throw new HTTP_Exception_400('No valid document ID was specified.');
    }
    $layout = View::factory('layouts/documents/edit')
        ->bind('back_link', $back_link)
        ->bind('values', $values)
        ->bind('errors', $errors)
        ->bind('success', $success)
        ->bind('is_acp', $is_acp);

    $is_acp = (strpos(Request::initial()->uri(), 'acp') !== FALSE);

    if ( ! $is_acp AND Auth::instance()->get('id') != $document->user_id)
    {
        throw new HTTP_Exception_403('Unauthorised access. You do not have permission to edit this document.');
    }
    elseif ($document->is_published AND ! Auth::instance()->get('is_admin'))
    {
        throw new HTTP_Exception_403('Unauthorised access. You cannot edit a published document.');
    }

    $back_link = $is_acp ? '/acp/documents' : '/account';

    $values = array();
    $errors = array();
    foreach ($document->table_columns() as $key => $null)
    {
        $values[$key] = $document->$key;
    }
    if (Request::initial()->method() == Request::POST)
    {
        // We assume that is_published and is_paid are unchecked. Later on we check to see if they are checked and change the values.
        if ($document->is_published == 1 AND $is_acp)
        {
            $values['is_published'] = -1;
        }
        if ($document->is_paid == 1 AND $is_acp)
        {
            $values['is_paid'] = 0;
        }
        foreach (Request::initial()->post() as $key => $val)
        {
            if ($key == 'is_published')
            {
                // Check for a first time publish, and if it is run the publish method to save the PDF.
                if ($document->is_published == 0)
                {
                    Request::factory('document/publish/'.$document->id)->query(array('no_redirect' => TRUE))->execute();
                }
                $values[$key] = 1;
            }
            elseif ($key == 'is_paid')
            {
                $values[$key] = 1;
            }
            else
            {
                $values[$key] = $val;
            }
        }
        $document->values(Request::initial()->post(), array('title', 'summary', 'category_id', 'content'));
        if ($is_acp)
        {
            $document->is_published = $values['is_published'];
            if ($document->is_published == 1)
            {
                $document->date_published = time();
            }
            $document->is_paid = $values['is_paid'];
        }
        try
        {
            $document->save();
            $success = TRUE;
        }
        catch (ORM_Validation_Exception $e)
        {
            $errors = $e->errors('models');
        }
        catch (Exception $e)
        {
            throw new HTTP_Exception_500($e->getMessage);
        }
    }
    $this->response->body($layout->render());
}

Это вершина моей конфигурации KCFinder:

$session_id = @$_GET['phpsession'];
session_start();
session_id($session_id);
define('ROOT', str_replace('eshop/kcfinder', '', __DIR__), TRUE);
var_dump(session_id(), $_SESSION); exit;

Когда я открываю KCFinder, сессия пуста (или имеет только сессию KCFinder по умолчанию) и не имеет отношения к сеансу Kohana. Может кто-нибудь, пожалуйста, помогите мне решить эту проблему?

1 ответ

Решение

Ваша проблема - порядок вызовов функций. Вы начинаете сеанс (который сгенерирует новый сеанс с новым идентификатором, если идентификатор не был передан) перед тем, как установить идентификатор сеанса, который вы передали в качестве параметра - он должен быть наоборот.

http://php.net/manual/en/function.session-id.php:

Если id указано, он заменит идентификатор текущей сессии. session_id() нужно позвонить раньше session_start() для этой цели.

Другие вопросы по тегам