CakePHP метод входа в сеанс чтения, если существует для перенаправления - PullRequest
0 голосов
/ 23 августа 2011

Я отключил autoRedirect, поэтому я могу добавить немного джаза в метод входа в систему моего контроллера пользователей и использовать сеанс для отправки их туда, откуда они пришли.

class UsersController extends AppController
{
    var $name = 'Users';

    var $components = array('Session');

    function beforeFilter()
    {
        parent::beforeFilter();

        $this->Auth->allow(array('login','logout','admin_logout','admin_login')); 

        $this->Session->write('back_to', $this->referer());
    }

    /**
     * Log in
     */

    function admin_login ()
    {
        $this->set('title_for_layout', 'Log in – Admin —');

        if(!(empty($this->data)) && $this->Auth->user())
        {   

            $back_to = $this->Session->read('back_to');

            if($back_to)
            {
                $this->redirect($back_to, null, true);
            }
            else
            {
                $this->redirect($this->Auth->redirect(), null, true);
            }
        }

        if($this->Auth->user())
        {
            $this->redirect($this->Auth->redirect(), null, true);
        }

    }

Так что идеяявляется то, что если у пользователя есть сеанс (99.% времени), то при отправке формы он отправит пользователя на предыдущую страницу, если нет, то отправит по умолчанию loginRedirect.

ПРИМЕЧАНИЕ: установив для autoRedirect значение false, CakePHP больше не использует сеанс Auth.Redirect!Таким образом, сохраненное там значение больше не используется приложением и является преднамеренным!

Проблема, с которой я сталкиваюсь, заключается в том, что мое приложение ВСЕГДА отправляет пользователя на панель инструментов из-за функции ниже «ЭтотКомментарий в коде выше.Если я удаляю эту функцию, то пользователь просто отправляется НАЗАД в форму входа в систему все время, НО они будут зарегистрированы!

Может кто-нибудь помочь?

Спасибо

ОБНОВЛЕНИЕ: вот мой код контроллера приложения:

class AppController extends Controller
{
    var $components = array('Auth','Session');

        public function beforeFilter()
        {

            parent::beforeFilter();

            $this->Auth->authorize = 'controller';

            $this->Auth->autoRedirect = false;

            $this->Auth->loginAction = array('controller'=>'users','action'=>'login','admin'=>true
            );

            $this->Auth->loginRedirect = array('admin'=>true,'controller' => 'dashboard', 'action' => 'index');

            $this->Auth->logoutRedirect = array('admin'=>false,'controller' => 'pages', 'action' => 'display','home');
        }

    function isAuthorized()
    {
        return true;
    }
}

Ответы [ 3 ]

1 голос
/ 23 августа 2011

Вы не существуете после перенаправления.Попробуйте изменить подпись перенаправления на:

$this->redirect( $back_to, null, true );

2-й аргумент - это код состояния, а третий - прекращение обработки текущего действия.Это должно помешать вам перейти к последнему перенаправлению, которое, я предполагаю, является выполняемым.

Учитывая наше "обсуждение" длинного комментария ниже, попробуйте настроить свой метод admin_login() следующим образом:

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

  if($back_to) {
    $this->redirect($back_to, null, true);
  }
  else {
    $this->redirect($this->Auth->redirect(), null, true);
  }
}
else {
  # Only write back_to when you arrive at the login page without data
  $this->Session->write('back_to', $this->referer());
}
0 голосов
/ 26 августа 2011
    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());
    }
0 голосов
/ 23 августа 2011
function login (){
  if(!empty($this->data) && !$this->Auth->user()){
    $this->Session->write('back_to', $this->referer());
  }

удалить этот сеанс-> записать в вашем beforeFilter.И вам не нужно $this->Auth->allow(array('login','logout'));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...