@inviziblll

Как решить проблему с ORM авторизацией в Kohana 3.3.4?

Возникла проблема с ORM авторизацией в Kohana 3.3.4 Создал базовый контроллер для авторизации Controller_Index_Auth который является наследником от класса Controller_Index а тот в свою очередь от базового контроллера Controller_Base. В базовом контроллере в поле $auth сохраняется объект фреймворка Auth::instance().

код базового контроллера

class Controller_Base extends Controller_Template {

    public $user;
    public $auth;
    public $cache;
    public $session;

    public function before() {
        parent::before();

        I18n::lang('ru');
        $settings = Kohana::$config->load('settings');
        Cookie::$salt = 'asd12d2';
        Session::$default = 'cookie';
        
        $this->cache = Cache::instance('file');
        $this->auth = Auth::instance();
        $this->user = $this->auth->get_user();
        $this->session = Session::instance();
    }
}


В контролере для обработки запросов авторизации Controller_Index_Auth я создал несколько методов. При авторизации из формы поступают данные и обрабатываются в методе action_login() если все нормально идет пере направление на контроллер Controller_Index_Account метод action_index() который должен отображать страницу с личными данными пользователя.

Авторизация срабатывает и перенаправляет на страницу с данными пользователя, но возникает проблема, уже в контроллере Controller_Index_Account я не могу получить никакой информации по авторизованному пользователю, метод фреймворка logged_in () почему-то возвращает false? Хотя когда я нахожусь в контроллере Controller_Index_Auth метод $this->auth->logged_in () возвращает true и я могу получить информацию по авторизованному пользователю используя метод фреймворка $this->auth->get_user(), как то странно, по идеи все данные после авторизации должны сохранятся в поле $auth и я могу их получить в любом контроллере приложения, но они не сохраняются!

код контроллера Controller_Index_Auth

class Controller_Index_Auth extends Controller_Index {

    public function action_index() {
        $this->action_login();
    }

    public function action_login() {

        if(Auth::instance()->logged_in()) {
            $this->redirect('account');
        }

        if (isset($_POST['submit'])){
            $data = Arr::extract($_POST, array('username', 'password', 'remember'));
            $status = $this->auth->login($data['username'], $data['password'], (bool) $data['remember']);


            //$role = $this->auth->logged_in();
            // var_dump($role);
            // $user =  $this->auth->get_user();
            // var_dump($user);
              
            if ($status){
                if($this->auth->logged_in('admin')) {
                    $this->redirect('admin');
                }
                
                $this->redirect('account');
            }
            else {
                $errors = array(Kohana::message('auth/user', 'no_user'));
            }
        }

        // ...
    }

    //...
}


В контроллере Controller_Index_Account в методе before() идет проверка на авторизацию, но оно не срабатывает $this->auth->logged_in() возвращает false хотя должен возвращать true.

код контроллера Controller_Index_Account
class Controller_Index_Account extends Controller_Index {

    public function before(){
        parent::before();
        
        if (!$this->auth->logged_in()) { // здесь идет проверка
            $this->redirect('login'); 
  
        }


        $account_menu = Widget::load('menuaccount');

         // Выводим в шаблон
        $this->template->block_right = null;
        $this->template->block_left = array($account_menu);
    }

    // ...

}


В файле настроек если поменять драйвер orm на file то авторизация работает нормально, в чем может быть причина?

код файла application/config/auth.php

return array(

	//'driver'       => 'file',
	 'driver'       => 'orm',
	'hash_method'  => 'sha256',
	'hash_key'     => 'asjdhas6f2e12kas',
	'lifetime'     => 1209600,
	'session_key'  => 'auth_user',

	// Username/password combinations for the Auth File driver
	'users' => array(
		// 'admin' => 'b3154acf3a344170077d11bdb5fff31532f679a1919e716a02',
		'user'=>'857c303e1102231b7e4a27aaa0a2dd6495aa2510c0290781614581f483efb11b'
	),

);
  • Вопрос задан
  • 590 просмотров
Пригласить эксперта
Ответы на вопрос 1
@entermix
1. Инициализируйте сессию:
$this->session = Session::instance();
перед тем, как делаете:
$this->auth = Auth::instance();
$this->user = $this->auth->get_user();


2. Используйте $this->request->query()/$this->request->post() вместо $_GET/$_POST

По вопросу, проверьте есть ли у пользователя роль login

И зачем в классе Controller_Index_Auth вы используете Auth::instance()->logged_in(), если омжно обращаться через $this->auth ?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы