Разделите сеанс между двумя веб-сайтами: устаревшим PHP и сайтом Kohana 3.1 - PullRequest
0 голосов
/ 28 июня 2011

У меня 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 не сохраняет моего пользователя между действиями и каждый раз выполняет принудительный вход в систему.

Я не знаюНе знаю, что мне делать.

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

1 Ответ

1 голос
/ 29 июня 2011

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

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

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

Иэто значение изменяется путем создания файла конфигурации с именем "session.php" в каталоге config.Поэтому я создал 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");
            }
        }
    }

}

вот и все ...

...