2015-02-11 75 views
0

我试图使用KCFinderCKEditorKohana。我需要每个用户访问他们自己的单独上传文件夹。为此,我想将当前用户ID传递给KCFinder。为了安全地做到这一点,我不能通过URL作为GET变量传递它,所以我需要通过会话来完成。在Kohana外访问Kohana中设置的会话变量

我试着在Kohana中设置变量,当我在Kohana中使用var_dump($_SESSION)时,变量就在那里。当我在KCFinder中这样做时,它不在那里。我检查了session_id,发现它在页面间发生变化,所以我将session_id作为GET变量通过URL传递给KCFinder,然后将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

[如果指定了'id',则会替换当前的会话ID。 'session_id()'需要在'session_start()'之前被调用。](http://php.net/manual/en/function.session-id.php) – CBroe 2015-02-11 10:09:25

+0

><我不敢相信这很简单。非常感谢你,自从昨天上午以来,我一直在为此苦恼... – Styphon 2015-02-11 10:11:16

+0

好吧,我添加了这个答案,所以你将有一些东西可以接受:-) – CBroe 2015-02-11 10:38:14

回答

1

你的问题是函数调用的顺序。在设置您作为参数传递的会话标识之前,您正在开始会话(如果没有标识已经通过,将会生成一个带有新标识的新会话) - 它需要反过来。

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

如果指定id,它将取代目前的会话ID。需要在session_start()之前调用session_id()