Странное поведение процессора 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, сессии, куках и всем прочем. Может кто уже сталкивался с такой проблемой и решал ее?
Serge Kosykh
10 октября 2013, 12:30
modx.pro
2 355
0

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

Василий Наумкин
10 октября 2013, 17:06
0
Если контекстов несколько, то в этом могут быть проблемы.
Если нет, то похоже на кэширование сесии php-apc.

Если юзер на уровне API аутентифицирован, значит у него есть нужные значения в сесси, вопрос — почему они не удалены?
    Serge Kosykh
    10 октября 2013, 18:19
    0
    Василий, спасибо большое, что откликнулся!

    Фронтэндовый контекст — один; классический «web». Но на всякий случай проставил везде по коду его конкретизацию.
    APC убрал совсем (он был установлен на сервере).

    Если юзер на уровне API аутентифицирован, значит у него есть нужные значения в сесси, вопрос — почему они не удалены?
    Согласен; в этом-то и вопрос.
    Но глюки пока все равно продолжаются. Выясняю, что же там сейчас не так.
      Василий Наумкин
      10 октября 2013, 20:06
      0
      Если был apc — то наверняка он и виноват. Проверяй, отключился ли он совсем — нужно глядеть в phpinfo().
      Алексей Карташов
      11 октября 2013, 01:30
      0
      А ещё есть такая шляпа, что юзер будет залогиненым до конца отработки приложения и разлогиненным он станет, грубо говоря, при нажатии F5. Т.е. в каком-то сниппете юзера разлогиниваем и следом проверяем $modx->user->isAuthenticated(); — будет работать. А вот при следующем обращении к странице юзер с самого начала уже будет разлогиненным (анонимом). Чтобы этого избежать надо принудительно после логаута написать:
      $modx->user = null;
      У меня когда-то такой же вопрос был, обсуждали как-то с Василием. Лень искать :-) Но выход, как оказалось, только такой.

      upd. во, нашёл.
        Serge Kosykh
        11 октября 2013, 17:03
        0
        Спасибо за помощь; отключение apc поспособствовало тому, что глюки стали, хотя бы, фиксированными, а не плавающими (проверил через phpinfo() — apc отключен).

        Зануление юзера — однозначно работает!

        Еще раз благодарю!
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          5