CakePHP удаляет сеанс при выходе пользователя

Как я могу проверить, покинул ли пользователь мою форму входа? Не войти в систему, а выйти из нее?

Поскольку я хочу удалить сеанс Auth.redirect, если они решат не входить в систему, чтобы, когда они вернутся позже, они не попали в свой предыдущий сеанс!

Итак, по существу, это:

$this->Session->delete('Auth.redirect');

Я думаю, какая-то проверка в AppController, которая знает, когда пользователь был направлен из формы входа, и удаляет сеанс auth.redirect???

Или еще лучше проверить, является ли текущая страница формой входа, и если нет, то удалить сеанс!!!

и для тех, кому интересно, вот как сейчас выглядит мой метод входа в систему:

function login()
{
        if(!(empty($this->data)) && $this->Auth->user())
        {
            $back_to = $this->Session->read('back_to');

            $auth_redirect = $this->Session->read('Auth.redirect');

            if($auth_redirect)
            {
                $this->redirect($auth_redirect, null, true);
            }
            else if($back_to)
            {
                $this->redirect($back_to, null, true);
            }
            else
            {
                $this->redirect($this->Auth->redirect(), null, true);
            }
        }
        else
        {
            $this->Session->write('back_to', $this->referer());
        }
}

Спасибо


person Cameron    schedule 25.08.2011    source источник
comment
@ Ответ Итана правильный, вы не можете знать, когда пользователь покинул ваш сайт. Я думаю, что вы пытаетесь избежать чрезвычайно узкого случая: пользователь заходит на ваш сайт, нажимает «Войти», покидает страницу, через некоторое время возвращается на страницу входа, входит в систему и затем перенаправляется туда, где они были раньше. Лично я был бы совершенно согласен с таким поведением, и мало кто когда-либо заметит это или будет заботиться об этом. Более того, значение Auth.redirect не остается навсегда. Сеанс в конечном итоге истечет, обычно в течение нескольких часов, что делает этот крайний случай еще более редким.   -  person deceze♦    schedule 26.08.2011
comment
Как насчет того, чтобы проверить, просматривают ли они форму входа в систему, и если нет, то удалить сеанс, чтобы он когда-либо существовал только в форме входа и после перенаправления, а затем, если они передумают, он будет удален, и вместо этого будет использоваться сеанс back_to. Не могли бы вы помочь с этим? Ваше здоровье   -  person Cameron    schedule 26.08.2011


Ответы (3)


Я не знаком с CakePHP, но ваш вопрос звучит для меня немного странно. Вы говорите о PHP, языке сценариев на стороне сервера. PHP-скрипт выполняется только тогда, когда приходит запрос (пожалуйста, поправьте меня, если я чего-то еще не знаю).

Таким образом, когда пользователь вызывает страницу входа, скрипт выполняется. Теперь подумайте о следующем: сразу после загрузки страницы входа пользователь закрывает вкладку браузера со страницей входа. Это не инициирует запрос, поэтому нет возможности сообщить серверу об этом действии.

Может быть, CakePHP умеет делать такие волшебные вещи, но я думаю, что мы говорим о HTTP без сохранения состояния, поэтому я не представляю, как реализовать что-то подобное.

person Ethan Leroy    schedule 25.08.2011

Вы можете добавить метку времени к сеансу, когда вы в последний раз получали запрос от пользователя. Например, в AppController::beforeFilter просто добавьте $this->Session->write('lastSeen', time()). Затем вы можете проверить, сколько времени прошло между последним открытием пользователем какой-либо страницы, и отбросить значение Auth.redirect, если этот интервал слишком велик.

Это в основном то же самое, что истечение сеанса, только более контролируемым образом. Если вы хотите подсчитывать время, когда пользователь просто отображает вашу страницу на своем экране, также как «активность», вы можете использовать некоторый Javascript AJAX, чтобы продолжать отправлять запросы на сервер, чтобы сигнализировать «Я активен!» /эм>

Это все довольно много работы для очень мало пользы. HTTP не имеет состояния и не позволяет легко отслеживать пользователя, и точка. На самом деле отслеживание того, «активно» ли пользователь просматривает вашу страницу, влечет за собой огромные накладные расходы и в этом случае кажется неуместным усилием для чрезвычайно узкой цели, для которой вы хотите его использовать.

person deceze♦    schedule 26.08.2011
comment
Я бы предпочел просто удалить сеанс, если текущая страница не является формой входа. Вы можете помочь сделать это? Ваше здоровье - person Cameron; 26.08.2011
comment
@Cameron По сути это означает, что вы можете просто отключить функцию автоматического перенаправления AuthComponent. - person deceze♦; 26.08.2011
comment
Я отключил его! Но я по-прежнему использую этот сеанс для отправки пользователей туда, откуда они пришли. - person Cameron; 26.08.2011

        if($this->here != '/admin/login')
        {
            $this->Session->delete('Auth.redirect');
        }

или это:

if($this->here != Router::url(array('admin'=>true,'controller'=>'users','action'=>'login')))
            {
                $this->Session->delete('Auth.redirect');
            }
person Cameron    schedule 26.08.2011
comment
$this->here != '/admin/login' легко сломается. $this->here содержит полный URL-адрес, а не только относительно корня приложения. т.е. он может содержать /apache/user/cake/myapp/admin/login, если вы установили свое приложение в подкаталог. Кроме того, вы не должны публиковать это как ответ на свой вопрос (или это так?). - person deceze♦; 26.08.2011
comment
Как тогда я мог сравнить это с действием контроллера? могу ли я сделать это: $this->here != array('controller'=>'users','action'=>'login') ??? - person Cameron; 26.08.2011
comment
где тогда мне указать имя контроллера и имя действия? поскольку я сравниваю исключительно с этим контроллером и действием! - person Cameron; 26.08.2011
comment
какие-либо обновления, так как я не понимаю, что делают $this->name и $this-action, поскольку я не говорю приложению искать контроллер пользователя или действие входа в систему, используя их???? - person Cameron; 26.08.2011
comment
В контроллере $this->name относится к текущему контроллеру, а $this->action относится к текущему действию. $this->params['controller'] относится к запрошенному контроллеру, то же самое относится и к действию. Делайте из этого что хотите, так как я не совсем уверен, в каком контексте вы все равно хотите это использовать. - person deceze♦; 27.08.2011
comment
Я хочу проверить, является ли текущий контроллер, который просматривает пользователь, контроллером пользователя и методом входа в систему. если НЕ, тогда удалите этот файл cookie, что и делает мой код выше, но он проверяет URL-адрес, а не контроллер/действие. Поэтому я не понимаю, как ваш код будет это делать, поскольку он не содержит информации ни о контроллере пользователей, ни о действии входа в систему... - person Cameron; 27.08.2011
comment
Ну тогда if ($this->name == $this->Auth->loginAction['controller'] && $this->action == $this->Auth->loginAction['action']). Вы должны сравнить его с действием, определенным в $this->Auth, в противном случае вам придется синхронизировать эти две настройки вручную. Но какой смысл сбрасывать это значение на каждой странице, кроме страницы входа? Это просто означает, что значение никогда не будет содержать ничего, кроме, возможно, страницы входа в систему, что кажется довольно бессмысленным. - person deceze♦; 27.08.2011
comment
Причина, по которой мне нужно удалить сеанс, заключается в том, что я не хочу, чтобы он использовался формой входа в систему, когда пользователь покидает страницу входа, поскольку она больше не нужна, и если пользователь вернется, он отправит их в исходное место, а не в новое местоположение, следовательно, его нужно было удалить! - person Cameron; 27.08.2011
comment
Кроме того, этот код по-прежнему не работает, поскольку он не учитывает префикс администратора в действии, которое я предполагаю. - person Cameron; 27.08.2011