Kohana Теряется авторизация

borodatych

недавненько
Доброго времени суток.

Переношу имеющийся проект, написанный в функциональном стиле, на данный ФВ.
Так как база уже есть, то текущий модуль авторизации чуть-чуть не подходит.
Но ни чего, по аналогии делаю свой...

За основу взял class Kohana_Auth_ORM extends Auth
Но с небольшим НО, просто class Auth_MyORM extends Auth, минуя пустой класс для расширения
class Auth_MyORM extends Kohana_Auth_MyORM{}

Первое что сделал:
PHP:
    protected function _login($user, $password, $remember){

        if( !is_object($user) ){
            $username = $user;

            // Load the user
            $user = ORM::factory($this->_config->model);
            $user->where($user->unique_key($username), '=', $username)->find();
        }

        if( is_string($password) ){
            // Create a hashed password
            //$password = $this->hash($password);
        }

        // If the passwords match, perform a login
        //if( $user->has('roles', ORM::factory('Role', array('name' => 'login'))) AND $user->password === $password ){
        if( $user->password === $password ){

            if( $remember === TRUE ){
                // Token data
                $data = array(
                    'user_id'    => $user->pk(),
                    'expires'    => time() + $this->_config['lifetime'],
                    'user_agent' => sha1(Request::$user_agent),
                );

                // Create a new autologin token
                $token = ORM::factory('User_Token')
                    ->values($data)
                    ->create();

                // Set the autologin cookie
                Cookie::set('authautologin', $token->token, $this->_config['lifetime']);
            }

            // Finish the login
            $this->complete_login($user);

            return TRUE;

        }

        // Login failed
        return FALSE;
    }
Первым делом я избавился от жесткой привязки к имени модели.
Заменил ORM::factory('User') на ORM::factory($this->_config->model).
Теперь имя модели берется из конфига, добавил гибкости так сказать.
После, закоментировал $password = $this->hash($password); , и дал тестовому пользователю просто пароль, далее будет своя реализация $this->hash()
Потом я избавился от ролей, их попросту нет в текущей базе...
Попутно пришлось $user->unique_key($username), пере определить в своей модели, заменив username на login.
Так как не считаю кол-во входов и прочее:
PHP:
protected function complete_login($user){
        //$user->complete_login();
        return parent::complete_login($user);
}
То закомментировал $user->complete_login()

В итоге, все как бы работает. В нужном контроллере:
PHP:
class Controller_UAuth extends Controller_Base{
...
if( $this->auth->login($data['login'],$data['password'], (bool) $data['remember']) ){
    Session::instance()->set('test3','testValue3');
    $this->e(Session::instance());
    HTTP::redirect('/cabinet');
}
$this->e(Session::instance()); - vardump + exit
И наблюдаю выхлоп:
HTML:
[test] => testValue
[last_active] => 1418792586
[UAuth] => Model_Clients Object
[test3] => testValue3
Радостно комментирую vardump и жму F5.
В контролере отвечающему маршруту /cabinet:
PHP:
class Controller_UAccount extends Controller_UAuth{
...
public function before(){
        $this->e( Session::instance('cookie') );
        parent::before();
}
Получаю:
HTML:
Session_Cookie Object
(
    [_name:protected] => session_cookie
    [_lifetime:protected] => 43200
    [_encrypted:protected] => default
    [_data:protected] => Array
        (
            [test] => testValue
            [last_active] => 1418792586
        )

    [_destroyed:protected] =>
)
[test] => testValue - был сформирован в Controller_Base
То что формировалось в Controller_UAuth, посеялось...

Есть у кого идеи, почему, что упустил?
 

borodatych

недавненько
В общем пока ждал ответа, решил повелосипедить:

PHP:
class Auth_MyORM extends Auth{

    protected function _login($user, $password, $remember){

        if( !is_object($user) ){
            $username = $user;
            // Load the user
            $user = ORM::factory($this->_config->model);
            $user->where($user->unique_key($username), '=', $username)->find();
        }

        // If the passwords match, perform a login
        if( $user->password === $password ){
            // Finish the login
            $this->complete_login($user);

            @session_start();
            $_SESSION[$this->_config['session_key']] = Session::instance()->get($this->_config['session_key']);

            return TRUE;
        }
    }

    public function logged_in($role = NULL){
        // Get the user from the session

        @session_start();
        Session::instance()->set( 'UAuth', Arr::get($_SESSION,'UAuth') );

        $user = $this->get_user();

        if( !$user ) return FALSE;

        if( $user->loaded() ){
            // If we don't have a roll no further checking is needed
            if( !$role ) return TRUE;
        }
    }

}
@session_start(); , именно с @, так как ругалось на что уже запущено.
Знаю, можно по другому, но не вижу смысла...не суть...

Предположил, что может кто то еще сессию стартует через @, сгрепил.
Нашел модуль, отключил, отключил свой костыль, без результата.
Сгрепил по системной папке, session_start() юзается только в классе Session_Native

В базовом контролере вырубаю Session::$default = 'cookie';
И все запустилось.

Пока не нашел следов, почему оно не работало через куку.

Может сейчас появились идею у кого?
 
Сверху