Совместное использование сеанса между двумя веб-сайтами: устаревшим PHP и сайтом Kohana 3.1.

У меня есть 2 веб-сайта php на одной машине. Первый сайт (устаревшая система) имеет базовую аутентификацию: проверяет, установлено ли $_SESSION['user_id']. Я работаю над вторым сайтом (основанным на Kohana 3.1), который расширит функциональность первого. Оба сайта будут связаны друг с другом, поэтому мне нужно разделить сеанс между этими системами. Оба сайта используют одну и ту же базу данных. Пользователи будут логиниться на первом сайте. На моем сайте есть код, который обнаруживает $_SESSION['user_id'] первого, но у меня проблемы с сохранением сеанса с модулем Kohana-Auth.

Первый сайт (устаревший) проверяет сеанс следующим образом:

<?php
session_start();
if(empty($_SESSION['user_id']))header("Location: index.php?action=3");
... //more dark code

это во всех файлах php... много файлов.

На моем сайте Kohana есть контроллер, который перед любым действием проверяет сессию.

<?php

class My_Controller extends Controller_Template {

    public function before() {
        session_start();
        $this->auth = Auth::instance();
        if ($this->auth->logged_in()) {
            //I have session in the second site... Do I have a session on the first one?

            if (!isset($_SESSION['user_id']) || $_SESSION['user_id'] == "") {
                //I have no session in the first site... I logout the user in my site
                $controller = Request::current()->controller();
                if ($controller != 'auth') {
                    Request::current()->redirect('auth/logout');
                }
            }
            $this->user = ORM::factory('user', $this->auth->get_user()->id);
        } else {
            //I have no session in the second site... Do I have a session on the first one?
            $user_id = isset($_SESSION['user_id']) ? $_SESSION['user_id'] : null;
            if (isset($user_id)) {
                $user = Model_User::get_user($user_id);
                if ($user->loaded()) {
                    //I have session in the first site... I login the user in my site
                    $this->auth->force_login($user);
                    $this->user = ORM::factory('user', $this->auth->get_user()->id);
                }
            }
            if (!$this->auth->logged_in()) {
                //I still have no session => redirect to login of the first site
                //Request::current()->redirect(...);
                echo Debug::vars("BUUUU");
            }
        }
    }

}

Этот код близок к работе: я могу перейти с одного сайта на другой, и пользователь будет обнаружен... но я понял, что когда пользователь перемещается между различными действиями на моем сайте Kohana, счетчик "логинов" таблицы пользователей увеличивается. Это означает, что перед любым действием "$this->auth->logged_in()" равно FALSE... и это означает, что модуль Auth не сохраняет моего пользователя между действиями и каждый раз выполняет принудительный вход в систему.

Я не знаю, что я могу сделать.

Я хочу определить сеанс с первого сайта, но я не хочу входить в систему с каждым кликом.


person mario    schedule 28.06.2011    source источник


Ответы (1)


Я нашел ответ!! В Kohana 3.1 класс Kohana_Session имеет значение файла cookie по умолчанию.

/**
 * @var  string  cookie name
 */
protected $_name = 'session';

Это значение не соответствовало имени сеанса PHP по умолчанию: «PHPSESSID».

И это значение изменяется путем создания файла конфигурации с именем «session.php» в каталоге конфигурации. Итак, я создал config/session.php следующим образом:

<?php defined('SYSPATH') or die('No direct script access.');

return array(
    'native' => array(
        'name' => 'PHPSESSID',
    )
);

И мой последний контроллер был примерно таким:

<?php

class My_Controller extends Controller_Template {

    public function before() {
        $this->auth = Auth::instance();
        if ($this->auth->logged_in()) {
            //I have session in the second site... Do I have a session on the first one?

            $user_id = Session::instance()->get('user_id');

            if (!isset($user_id) || $user_id == "") {
                //I have no session in the first site... I logout the user in my site
                $controller = Request::current()->controller();
                if ($controller != 'auth') {
                    Request::current()->redirect('auth/logout');
                }
            }
            $this->user = ORM::factory('user', $this->auth->get_user()->id);
        } else {
            //I have no session in the second site... Do I have a session on the first one?

            $user_id = Session::instance()->get('user_id');

            if (isset($user_id) && $user_id != "") {
                $user = Model_User::get_user($user_id);
                if ($user->loaded()) {
                    //I have session in the first site... I login the user in my site
                    $this->auth->force_login($user);
                    $this->user = ORM::factory('user', $this->auth->get_user()->id);
                }
            }
            if (!$this->auth->logged_in()) {
                //I still have no session => redirect to login of the first site
                //Request::current()->redirect(...);
                echo Debug::vars("BUUUU");
            }
        }
    }

}

это все...

person mario    schedule 29.06.2011