Залогиненный через процессор юзер не доступен в $modx->user
Народ, я понимаю — праздники, все дела… Но реально не понимаю что происходит! Помогите разобраться :-(
В общем ситуация.
Взял вот этот процессор для фоновой регистрации (изменил только немного), создаю через него юзера и затем логиню (тоже через процессор).
Но фишка в том, что юзер создаётся нормально, и даже логинится. Но вот в системной переменной $modx->user всё-равно сидит anonymous!
Вот хоть убейте — не понимаю в чём причина может быть! Даже контекст перезагружал, а всё бестолку.
Дальше у меня создаются документы от имени этого юзера, а юзера-то и нет! И ресурсы получаются без автора. А это, сами понимаете, никуда не годится…
Вот процессор (web/user/create):
Вот код:
А вот то, что этот код выдаёт:
Т.е. пользователя создали, данные о нём есть, авторизация проходит удачно(!), а вот в $modx->user этого пользователя нету :-(
Соответственно, при создании документа modx тоже не видит пользователя и в поле createdby ресурса ставит 0.
Вот такая вот фигня.
Выручайте, пожалуйста, сил уже нет, сколько бьюсь с этой фигнёй. Прям мистика какая-то
В общем ситуация.
Взял вот этот процессор для фоновой регистрации (изменил только немного), создаю через него юзера и затем логиню (тоже через процессор).
Но фишка в том, что юзер создаётся нормально, и даже логинится. Но вот в системной переменной $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.
Вот такая вот фигня.
Выручайте, пожалуйста, сил уже нет, сколько бьюсь с этой фигнёй. Прям мистика какая-то
Комментарии: 8
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Ну т.е. в лог ошибку-то я записываю, но вот not_logged_in (Не вошёл!) процессор отдаёт. И почему вот он её отдаёт?..
А вот по сабжу выяснилось вот что: юзер логинится, но это становится видно только после перезагрузки страницы.
Т.е. получается, что при
в $modx->user пользователь станет доступен не прям сразу после вызова процессора, а только при перезагрузке страницы. С логаутом та же картина.
Уже что-то, но всё-равно не годится :-(
Чтобы данные о пользователе в системе были доступны сразу же после логина, надо просто перезаписывать $modx->user:
При логауте устанавливать в анонима:
Не знаю, на сколько правильный подход и что может сломаться при таком действии, но другого варианта я пока не вижу.
Если кто-то прочитает это после праздников и у него будут мысли по этому поводу — не стесняйтесь их здесь высказывать :-)
Почему бы юзера сразу не перезаписывать? У разработчиков были причины?
А если были, то есть вероятность, что при таком подходе что-то где-то может сломаться или сработать не так…
Но вообще, странное, на мой взгляд, поведение.
MODX — фреймворк, с определенной дефолтной логикой, в которой можно почти все изменить. Что ты и делаешь. Не думаю, что это недоработка — нельзя предусмотреть всё сразу.
Так что, твой код вполне нормальный, ничего не сломается. Если хочешь более красивого решения — можно унаследовать процессор и переписать, как тебе нужно.
Тем более, если других вариантов нет)
Авторизация или стандартным Login или гибрид Auth.
Когда потом делаю ajax запрос через компоненты, (например обновляю инфу или делаю запись в БД, где надо знать от кого пришел запрос), то пользователь аноним.
$modx->user->isAuthenticated('web') — false