Разрешение статической странице проходить через логин в cakePHP

У меня есть статическая страница, которую я хочу добавить в существующий проект cakePHP. Мне удалось обойти Auth с помощью этого кода на PagesController

public $allowedPages = array('main',); 


public function beforeFilter() {
$this->Auth->allow('display');
}
public function display()
{
    $path = func_get_args();

    $count = count($path);
    if (!$count) {
        return $this->redirect('/');
    }
    $page = $subpage = null;

    if (!empty($path[0])) {
        $page = $path[0];
    }
    if (!empty($path[1])) {
        $subpage = $path[1];
    }
    $this->set(compact('page', 'subpage'));

    /*add CHU
    if(in_array($page, $this->allowedPages) || $this->User->loggedin) {
    $this->render($page);
    } */

    if(in_array($page, $this->allowedPages) ) {
        $this->render($page); //here redirects to login page change the path if the path is different
    }


    try {
        $this->render(implode('/', $path));
    } catch (MissingTemplateException $e) {
        if (Configure::read('debug')) {
            throw $e;
        }
        throw new NotFoundException();
    }
}

И добавил маршрут следующим образом:

$routes->connect('/main', ['controller' => 'Pages', 'action' => 'display', 'main']);

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

if(in_array($page, $this->allowedPages) ) {
        $this->render($page); //here redirects to login page change the path if the path is different
    }

Как я могу это сделать?

Я попробовал эти ответы: Аутентификация для статической страницы

Разрешение определенной страницы в Cakephp


person Yohan Blake    schedule 11.03.2016    source источник
comment
Тем, что вы там делаете, вы полностью обходите аутентификацию, что не слишком хорошая идея. Вместо этого попробуйте разрешить определенные страницы через компонент аутентификации: stackoverflow.com/questions/18015096/   -  person ndm    schedule 11.03.2016
comment
Каковы URL-адрес и действие вашей страницы входа? Это написано в PagesController?   -  person Object Manipulator    schedule 11.03.2016
comment
@ndm, я добавил класс в рекомендованный вами ответ. Я получил следующие ошибки и предупреждения без загрузки страницы: Strict (2048): Declaration of App\Controller\PagesController::beforeFilter() should be compatible with App\Controller\AppController::beforeFilter(Cake\Event\Event $event) [APP/Controller/PagesController.php, line 29] Warning (4096): Argument 1 passed to App\Controller\AppController::beforeFilter() must be an instance of Cake\Event\Event, none given, called in /var/www/sty_reps/src/Controller/PagesController.php on line 34 and defined [APP/Controller/AppController.   -  person Yohan Blake    schedule 12.03.2016
comment
@ObjectManipulator, URL-адрес страницы входа — имя сайта/логин. sitename/ также перенаправляет на /login. Они определены в маршрутах, а не в PageController.   -  person Yohan Blake    schedule 12.03.2016
comment
@YohanBlake Тогда пример кода в вашем вопросе завершится с той же ошибкой. Если у вас возникнут вопросы в будущем, пожалуйста, всегда указывайте точную версию CakePHP и помечайте свой вопрос соответствующим тегом! Сообщение об ошибке довольно ясное, вам нужно использовать совместимую подпись и соответствующим образом вызвать родительский метод. http://book.cakephp.org/3.0/en/controllers.html#Cake%5CController%5CController::beforeFilter   -  person ndm    schedule 12.03.2016


Ответы (1)


Не думаю, что нужно проходить через столько хлопот. Например: если имя вашего действия «privacyPolicy», вы можете просто указать его в $this->Auth->allow() в самом AppController.

Если вы хотите сохранить его отдельно и написать в PagesController, я предлагаю вам вызвать родительскую функцию. В противном случае фильтр beforeFilter внутри PagesController переопределяет фильтр beforeFilter AppController.

   //AppController.php

  /* Other code */

  public function beforeFilter() {

  ..........

  $this->Auth->allow(array(
     "action1",
     "action2",
     "display"
   ));
  }

_____________________ OR ________________________________

  // PagesController.php

   public function beforeFilter() {
      parent::beforeFilter(); // Add this line
      $this->Auth->allow('display');
   }

Надеюсь это поможет.

Мир! хD

person Object Manipulator    schedule 12.03.2016
comment
Редактирование в AppController работает нормально, но теперь проблема в том, что mysite/ не перенаправляет на страницу /login. Может быть, из-за включения "display" в массив разрешений? Это код в файле маршрута, который должен выполнять маршрут: $routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']); - person Yohan Blake; 12.03.2016
comment
в основном, делая то, что вы упомянули, он отлично работает, если пользователь вошел в систему. Но если пользователь не вошел в систему, mysite/ не перенаправляется на mysite/login - person Yohan Blake; 12.03.2016
comment
@ObjectManipulator Контроллер страниц обслуживает все страницы с помощью одного действия, поэтому, безоговорочно разрешив действие display, вы разрешите доступ ко всем страницам, поэтому хлопоты с проверкой запрошенной страницы необходимы. - person ndm; 12.03.2016