Залогиненный через процессор юзер не доступен в $modx->user

Народ, я понимаю — праздники, все дела… Но реально не понимаю что происходит! Помогите разобраться :-(

В общем ситуация.
Взял вот этот процессор для фоновой регистрации (изменил только немного), создаю через него юзера и затем логиню (тоже через процессор).

Но фишка в том, что юзер создаётся нормально, и даже логинится. Но вот в системной переменной $modx->user всё-равно сидит anonymous!
Вот хоть убейте — не понимаю в чём причина может быть! Даже контекст перезагружал, а всё бестолку.
Дальше у меня создаются документы от имени этого юзера, а юзера-то и нет! И ресурсы получаются без автора. А это, сами понимаете, никуда не годится…

Вот процессор (web/user/create):
<?php
require MODX_CORE_PATH . 'model/modx/processors/security/user/create.class.php';
class UserCreateProcessor extends modUserCreateProcessor {
	public $classKey = 'modUser';
	public $languageTopics = array('user');
	public $permission = '';
	public $objectType = 'user';
	public $beforeSaveEvent = 'OnBeforeUserFormSave';
	public $afterSaveEvent = 'OnUserFormSave';

	public function beforeSet() {
		if (!$this->getProperty('email')) {
			return $this->addFieldError('email', $this->modx->lexicon('field_required'));
		}
		if (!$this->getProperty('username')) {
			return $this->addFieldError('username', $this->modx->lexicon('field_required'));
		}
		$this->setProperty('passwordnotifymethod', 's');
		$this->setProperty('passwordgenmethod', 'spec');
		$this->setProperty('specifiedpassword', md5($this->getProperty('username')));
		$this->setProperty('confirmpassword', md5($this->getProperty('username')));
		$this->setProperty('hash_class', 'hashing.modMD5');
		$this->setProperty('groups', '[{"usergroup":"2","role":"1"]}');
		$this->setProperty('active', true);
		return parent::beforeSet();
	}
}
return 'UserCreateProcessor';

Вот код:
<?
if (!isset($_POST['email'])) {
	return;
}
$logged = false;
// если юзер не залогинен
if (!$modx->user->id) {
	$email		= $_POST['email'];  // email проверяется
	$username	= $email; 	    // email и username делаем одинаковыми
	$user = $modx->getObject('modUser', array('username' => $username));
	// если такого ещё не существует
	if (!$user) {
		// создаём нового через свой процессор
		$response = $modx->runProcessor('web/user/create', array(
			'username' 	=> $username
			,'email' 	=> $email
		));
		// создать не получилось
		if ($response->isError()) {
			$modx->log(modX::LOG_LEVEL_ERROR, 'User create error. Username: '.$username.', Message: '.$response->getMessage());
			exit; // здесь обработка ошибки
		}
		// пользователь создан, запоминаем его
		else {
			$user = $modx->getObject('modUser', array('username' => $username));
		}
		$modx->error->reset();
	}
}
// пользователь залогинен
else {
	// запоминаем его
	$user = $modx->user;
	$logged = true;
}

// Посмотрим, был ли пользователь уже вошедшим
echo 'User logged: ';
var_dump($logged);
// функция для логина и обработки соответствующих ошибок
if (!function_exists('loginUser')) {
	function loginUser ($data = array()) {
		global $modx;
		// логиним
		$response = $modx->runProcessor('security/login', $data);
		$result = true;
		// если не получилось
		if ($response->isError()) {
			$message = $response->getMessage();
			$modx->log(modX::LOG_LEVEL_ERROR, 'Login user error. Username: '.$data['username'].', Message: '.$message);
			$result = false;
		}
		$modx->error->reset();
		return $result;
	}
}

// выведем данные о пользователе (в этой переменной может быть как залогиненный юзер,
// так и незалогиненный и только что созданный)
print_r($user->toArray());
// если юзер не залогинен - логиним его и записываем результат
$loginResult = (!$logged) 
	? loginUser(array(
		'username'		=> $user->username
		,'password'		=> md5($user->username)
		,'rememberme'		=> 1
		,'login_context'	=> $modx->context->key
	  ))
	: true;
// выводит результат входа
echo 'Login result: ';
var_dump($loginResult);
// $modx->reloadContext($modx->context->key); // даже пробовал контект перезагружать
// выводим юзера из $modx->user
print_r($modx->user->toArray());

А вот то, что этот код выдаёт:
User logged: bool(false)
Array
(
    [id] => 84
    [username] => mail@example.com
    [password] => 7ee33fdbc5959d832d174f1bfa849dd8
    [cachepwd] => 
    [class_key] => modUser
    [active] => 1
    [remote_key] => 
    [remote_data] => 
    [hash_class] => hashing.modMD5
    [salt] => 284890ed773eb8c78370ddbd7b4cbf60
    [primary_group] => 0
    [session_stale] => 
    [sudo] => 
)
Login result: bool(true)
Array
(
    [id] => 0
    [username] => (anonymous)
    [password] => 
    [cachepwd] => 
    [class_key] => modUser
    [active] => 1
    [remote_key] => 
    [remote_data] => 
    [hash_class] => hashing.modPBKDF2
    [salt] => 
    [primary_group] => 0
    [session_stale] => 
    [sudo] => 
)

Т.е. пользователя создали, данные о нём есть, авторизация проходит удачно(!), а вот в $modx->user этого пользователя нету :-(
Соответственно, при создании документа modx тоже не видит пользователя и в поле createdby ресурса ставит 0.

Вот такая вот фигня.
Выручайте, пожалуйста, сил уже нет, сколько бьюсь с этой фигнёй. Прям мистика какая-то
Алексей Карташов
02 мая 2013, 13:08
modx.pro
1
4 149
0

Комментарии: 8

Алексей Карташов
02 мая 2013, 18:19
0
Попробовал сейчас на тестовом воспроизвести, так там вообще система не даёт пользователя зарегистрировать — в лог падает ошибка:
User create error. Username: mail@example.com, Message: not_logged_in
Ну т.е. в лог ошибку-то я записываю, но вот not_logged_in (Не вошёл!) процессор отдаёт. И почему вот он её отдаёт?..
    Алексей Карташов
    02 мая 2013, 18:46
    0
    Так, на тестовом мой косяк, внутри функции loginUser забыл написать global $modx.

    А вот по сабжу выяснилось вот что: юзер логинится, но это становится видно только после перезагрузки страницы.
    Т.е. получается, что при
    $modx->runProcessor('security/login', $data);
    в $modx->user пользователь станет доступен не прям сразу после вызова процессора, а только при перезагрузке страницы. С логаутом та же картина.
    Уже что-то, но всё-равно не годится :-(
    Алексей Карташов
    02 мая 2013, 18:52
    0
    В общем, пока выход такой:
    Чтобы данные о пользователе в системе были доступны сразу же после логина, надо просто перезаписывать $modx->user:
    $modx->user = $user;
    При логауте устанавливать в анонима:
    $modx->user = $modx->getObject('modUser', 0);
    Не знаю, на сколько правильный подход и что может сломаться при таком действии, но другого варианта я пока не вижу.

    Если кто-то прочитает это после праздников и у него будут мысли по этому поводу — не стесняйтесь их здесь высказывать :-)
      Василий Наумкин
      02 мая 2013, 19:01
      0
      Я так и делал на amd2013.ru — иначе не придумал.
        Алексей Карташов
        02 мая 2013, 19:11
        0
        Тогда по логике получается, что это не доработка системы? Или ошибка?
        Почему бы юзера сразу не перезаписывать? У разработчиков были причины?
        А если были, то есть вероятность, что при таком подходе что-то где-то может сломаться или сработать не так…

        Но вообще, странное, на мой взгляд, поведение.
          Василий Наумкин
          02 мая 2013, 19:22
          0
          Очень просто: юзер инициализируется до загрузки страницы, на которой отрабатывает твой скрипт с авторизацией.

          MODX — фреймворк, с определенной дефолтной логикой, в которой можно почти все изменить. Что ты и делаешь. Не думаю, что это недоработка — нельзя предусмотреть всё сразу.

          Так что, твой код вполне нормальный, ничего не сломается. Если хочешь более красивого решения — можно унаследовать процессор и переписать, как тебе нужно.
            Алексей Карташов
            02 мая 2013, 20:18
            0
            Не, меня всё устраивает :-)
            Тем более, если других вариантов нет)
      Yani
      20 ноября 2013, 10:19
      0
      Возникла такая же проблема.
      Авторизация или стандартным Login или гибрид Auth.
      Когда потом делаю ajax запрос через компоненты, (например обновляю инфу или делаю запись в БД, где надо знать от кого пришел запрос), то пользователь аноним.
      $modx->user->isAuthenticated('web') — false
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        8