2015-09-16 7 views
1

То, что я хочу:
Когда пользователь не вошел в систему и пытается зайти на сайт в любой URL они получают перенаправлены/посадки (который имеет форму на нем, что сообщения в/входа в систему)CakePHP loginAction не работает

Что происходит:
Когда пользователь не вошел в систему и пытается зайти на сайт в любой URL они получают перенаправлены/логин


в моей AppController у меня есть:

public $components = array(
     'Auth' => array(
      ... 
      'loginRedirect' => array('controller' => 'twitter', 'action' => 'index'), 
      'loginAction' => '/landing', 
      'logoutRedirect' => '/landing', 
      'unauthorizedRedirect' => '/landing', 
      'authorize' => array('Actions' => array('actionPath' => 'controllers')) 
     )); 

     public function beforeFilter() { 
      $this->Auth->allow('login', 'landing'); 
     } 

Я думал 'loginAction' => '/landing' бы решение, но это не помогло

Любые идеи?

+0

Вы только разрешаете пользователю посещать страницу «входа» в beforeFilter, попробуйте добавить «приземление» тоже – katwhocodes

+0

Я уже сделал, забыл добавить его в фрагмент. Обновлено сейчас – sharif9876

+0

Где маршруты для '/ посадки' и'/login' точки соответственно? – user221931

ответ

0

Вам не хватает контроллера?

'Auth' => array(
      'loginRedirect' => array(
       'controller' => 'items', 
       'action' => 'index' 
      ), 
      'logoutRedirect' => array(
       'controller' => 'users', 
       'action' => 'login' 
      ), 
      'authenticate' => array(
       'Form' => array(
        'passwordHasher' => 'Blowfish' 
       ) 
      ) 
     ) 
+0

/логин и/посадка направляются в соответствующие контроллеры и действия. Использование формы массива все равно не работает – sharif9876

0

Из вашего фрагмента кода, похоже, вы кладете $this->Auth->allow() правила в beforeFilter() методы AppController:

public function beforeFilter() { 
    $this->Auth->allow('login', 'landing'); 
} 

Проблема заключается в том, что с ваших /landing точек маршрута до вашего pages контроллера и /login к вашему users, если ваш метод контроллеров beforeFilter() не вызвал метод их родителя:

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

эти правила никогда не будут действовать. И если вы добавите этот код выше, вы фактически позволяете использовать оба метода landing и login в обоих контроллерах (если они существуют).

Как это теперь, родитель (видимо) никогда не называли, и поэтому, когда вы посещаете URL как /bogus, вы попадаете на /landing, как вы установили в AuthComponent «ы loginAction. Но так как это никогда не разрешено прямо в контроллере pagesbeforeFilter(), вы снова перенаправляетесь на /login. Весь процесс выглядит так: всегда перенаправлен на /login независимо от того, какой URL-адрес вы посещаете.

Имейте в виду, что как у вас есть, правило allow() для login не выполнено. Вы можете посетить /login, потому что торт автоматически разрешает его (иначе вы окажетесь в бесконечном цикле).

Итак, сначала удалите правило landing от allow(). Вам это не нужно.

Затем переместите код beforeFilter() в контроллер pages. Измените landing на display как метод, который называется display внутри этого контроллера, передается аргумент landing. Там нет метода landing (я предполагаю - и если есть, маршрут указывает на pages 'display, поэтому он не будет иметь никакого эффекта)!

Последнее изменение сделает display действия разрешено для любой страницы, переданной в качестве аргумента (например, landing, home, eula или какого-либо еще вы могли бы быть с). Если вы не хотите, чтобы вы добавляли чек либо в beforeFilter(), либо в display() и разрешали только продолжить, если аргумент landing.

Смежные вопросы