Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 16 июл 2020, 18:26

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Теряется авторизация
СообщениеДобавлено: 17 дек 2014, 11:06 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 23 июл 2012, 21:58
Сообщения: 100
Доброго времени суток.

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

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

Первое что сделал:
Код:
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.
Так как не считаю кол-во входов и прочее:
Код:
protected function complete_login($user){
        //$user->complete_login();
        return parent::complete_login($user);
}

То закомментировал $user->complete_login()

В итоге, все как бы работает. В нужном контроллере:
Код:
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
И наблюдаю выхлоп:
Код:
[test] => testValue
[last_active] => 1418792586
[UAuth] => Model_Clients Object
[test3] => testValue3


Радостно комментирую vardump и жму F5.
В контролере отвечающему маршруту /cabinet:
Код:
class Controller_UAccount extends Controller_UAuth{
...
public function before(){
        $this->e( Session::instance('cookie') );
        parent::before();
}

Получаю:
Код:
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, посеялось...

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Теряется авторизация
СообщениеДобавлено: 17 дек 2014, 22:25 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
ну так ты же перезаписываешь данные сессии в классе наследнике, а потом вызываешь родительский метод..
Код:
public function before(){
        $this->e( Session::instance('cookie') );
        parent::before();
}

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Теряется авторизация
СообщениеДобавлено: 18 дек 2014, 13:37 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 23 июл 2012, 21:58
Сообщения: 100
Не соглашусь. Насколько могу судить, при таком стопе, то что в родители не выполняется?!
Тогда почему я вижу, то что сформировалось при первом проходе именно из базавого контроллера?
Цитата:
[test] => testValue - был сформирован в Controller_Base


Добавлю инфы:

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

Код:
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(  $this->_config['session_key'],  Arr::get($_SESSION,$this->_config['session_key']) );

        $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';
И все запустилось.

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Теряется авторизация
СообщениеДобавлено: 18 дек 2014, 15:49 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
@borodatych естественно я могу ошибаться - по этим огрызкам сложно что-то понять. лучше залей все вышеописанные файлы на гитхаб например и напиши что ты пытаешься сделать в итоге.

Код:
$_SESSION[$this->_config['session_key']] = Session::instance()->get($this->_config['session_key']);

а зачем это? На мой взгляд хранить сессии в куки или куки в сессиях это изврат.

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group