Залогиненный через процессор юзер не доступен в $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
Попробовал сейчас на тестовом воспроизвести, так там вообще система не даёт пользователя зарегистрировать — в лог падает ошибка:
User create error. Username: mail@example.com, Message: not_logged_inНу т.е. в лог ошибку-то я записываю, но вот not_logged_in (Не вошёл!) процессор отдаёт. И почему вот он её отдаёт?..
Так, на тестовом мой косяк, внутри функции loginUser забыл написать global $modx.
А вот по сабжу выяснилось вот что: юзер логинится, но это становится видно только после перезагрузки страницы.
Т.е. получается, что при
Уже что-то, но всё-равно не годится :-(
А вот по сабжу выяснилось вот что: юзер логинится, но это становится видно только после перезагрузки страницы.
Т.е. получается, что при
$modx->runProcessor('security/login', $data);
в $modx->user пользователь станет доступен не прям сразу после вызова процессора, а только при перезагрузке страницы. С логаутом та же картина.Уже что-то, но всё-равно не годится :-(
В общем, пока выход такой:
Чтобы данные о пользователе в системе были доступны сразу же после логина, надо просто перезаписывать $modx->user:
Если кто-то прочитает это после праздников и у него будут мысли по этому поводу — не стесняйтесь их здесь высказывать :-)
Чтобы данные о пользователе в системе были доступны сразу же после логина, надо просто перезаписывать $modx->user:
$modx->user = $user;
При логауте устанавливать в анонима:$modx->user = $modx->getObject('modUser', 0);
Не знаю, на сколько правильный подход и что может сломаться при таком действии, но другого варианта я пока не вижу.Если кто-то прочитает это после праздников и у него будут мысли по этому поводу — не стесняйтесь их здесь высказывать :-)
Я так и делал на amd2013.ru — иначе не придумал.
Тогда по логике получается, что это не доработка системы? Или ошибка?
Почему бы юзера сразу не перезаписывать? У разработчиков были причины?
А если были, то есть вероятность, что при таком подходе что-то где-то может сломаться или сработать не так…
Но вообще, странное, на мой взгляд, поведение.
Почему бы юзера сразу не перезаписывать? У разработчиков были причины?
А если были, то есть вероятность, что при таком подходе что-то где-то может сломаться или сработать не так…
Но вообще, странное, на мой взгляд, поведение.
Очень просто: юзер инициализируется до загрузки страницы, на которой отрабатывает твой скрипт с авторизацией.
MODX — фреймворк, с определенной дефолтной логикой, в которой можно почти все изменить. Что ты и делаешь. Не думаю, что это недоработка — нельзя предусмотреть всё сразу.
Так что, твой код вполне нормальный, ничего не сломается. Если хочешь более красивого решения — можно унаследовать процессор и переписать, как тебе нужно.
MODX — фреймворк, с определенной дефолтной логикой, в которой можно почти все изменить. Что ты и делаешь. Не думаю, что это недоработка — нельзя предусмотреть всё сразу.
Так что, твой код вполне нормальный, ничего не сломается. Если хочешь более красивого решения — можно унаследовать процессор и переписать, как тебе нужно.
Не, меня всё устраивает :-)
Тем более, если других вариантов нет)
Тем более, если других вариантов нет)
Возникла такая же проблема.
Авторизация или стандартным Login или гибрид Auth.
Когда потом делаю ajax запрос через компоненты, (например обновляю инфу или делаю запись в БД, где надо знать от кого пришел запрос), то пользователь аноним.
$modx->user->isAuthenticated('web') — false
Авторизация или стандартным Login или гибрид Auth.
Когда потом делаю ajax запрос через компоненты, (например обновляю инфу или делаю запись в БД, где надо знать от кого пришел запрос), то пользователь аноним.
$modx->user->isAuthenticated('web') — false
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.