Странное поведение процессора Logout
Все доброго времени суток!
Если коротко — то MODX Revo 2.2.8, процессор Logout отрабатывает без ошибок и MODX потом правила авторизации соблюдает (разлогиненному юзеру становятся недоступны те документы, которые ему не должны быть доступны), но юзер на уровне API в сниппете числится как не разлогиненный. Кто-кто с таким сталкивался? Есть ли «лечение»?
Теперь подробно.
Делаю logout юзера с фронтэнда, как это и описывается в документации (и у Василия статья вот здесь modx.pro/development/56/ об этом же):
И по группам ресурсов этот разлогиненный юзер отрабатывается MODX'ом корректно (то есть те ресурсы, что не должны быть доступны разлогиненому юзеру — ему становятся недоступны).
Однако, при попытке проверить на разлогиненном юзере:
Причем:
И даже
Очень не хочется копаться в процессоре logout, сессии, куках и всем прочем. Может кто уже сталкивался с такой проблемой и решал ее?
Если коротко — то MODX Revo 2.2.8, процессор Logout отрабатывает без ошибок и MODX потом правила авторизации соблюдает (разлогиненному юзеру становятся недоступны те документы, которые ему не должны быть доступны), но юзер на уровне API в сниппете числится как не разлогиненный. Кто-кто с таким сталкивался? Есть ли «лечение»?
Теперь подробно.
Делаю logout юзера с фронтэнда, как это и описывается в документации (и у Василия статья вот здесь modx.pro/development/56/ об этом же):
$response = $modx->runProcessor('/security/logout');
if ($response->isError()) {
$modx->log(modX::LOG_LEVEL_ERROR, 'Logout error. Username: '.$modx->user->get('username').', uid: '.$modx->user->get('id').'. Message: '.$response->getMessage());
}
Все, вроде бы, хорошо. Ошибок в журнале нет.И по группам ресурсов этот разлогиненный юзер отрабатывается MODX'ом корректно (то есть те ресурсы, что не должны быть доступны разлогиненому юзеру — ему становятся недоступны).
Однако, при попытке проверить на разлогиненном юзере:
$modx->user->isAuthenticated();
получаю true.Причем:
$modx->user->get('id')
возвращает id этого, уже разлогиненного юзера, а вовсе не ожидаемый «0».И даже
$user->isMember('Logged in users')
Тоже возвращается, что юзер, несмотря на факт разлогинивания, остался членом группы 'Logged in users'.Очень не хочется копаться в процессоре logout, сессии, куках и всем прочем. Может кто уже сталкивался с такой проблемой и решал ее?
Комментарии: 5
Если контекстов несколько, то в этом могут быть проблемы.
Если нет, то похоже на кэширование сесии php-apc.
Если юзер на уровне API аутентифицирован, значит у него есть нужные значения в сесси, вопрос — почему они не удалены?
Если нет, то похоже на кэширование сесии php-apc.
Если юзер на уровне API аутентифицирован, значит у него есть нужные значения в сесси, вопрос — почему они не удалены?
Василий, спасибо большое, что откликнулся!
Фронтэндовый контекст — один; классический «web». Но на всякий случай проставил везде по коду его конкретизацию.
APC убрал совсем (он был установлен на сервере).
Но глюки пока все равно продолжаются. Выясняю, что же там сейчас не так.
Фронтэндовый контекст — один; классический «web». Но на всякий случай проставил везде по коду его конкретизацию.
APC убрал совсем (он был установлен на сервере).
Если юзер на уровне API аутентифицирован, значит у него есть нужные значения в сесси, вопрос — почему они не удалены?Согласен; в этом-то и вопрос.
Но глюки пока все равно продолжаются. Выясняю, что же там сейчас не так.
Если был apc — то наверняка он и виноват. Проверяй, отключился ли он совсем — нужно глядеть в phpinfo().
А ещё есть такая шляпа, что юзер будет залогиненым до конца отработки приложения и разлогиненным он станет, грубо говоря, при нажатии F5. Т.е. в каком-то сниппете юзера разлогиниваем и следом проверяем $modx->user->isAuthenticated(); — будет работать. А вот при следующем обращении к странице юзер с самого начала уже будет разлогиненным (анонимом). Чтобы этого избежать надо принудительно после логаута написать:
upd. во, нашёл.
$modx->user = null;
У меня когда-то такой же вопрос был, обсуждали как-то с Василием. Лень искать :-) Но выход, как оказалось, только такой.upd. во, нашёл.
Спасибо за помощь; отключение apc поспособствовало тому, что глюки стали, хотя бы, фиксированными, а не плавающими (проверил через phpinfo() — apc отключен).
Зануление юзера — однозначно работает!
Еще раз благодарю!
Зануление юзера — однозначно работает!
Еще раз благодарю!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.