Маршрутизация и переадресация раздела администратора CakePHP

Я борюсь с концепцией создания раздела admin в CakePHP-проекте. (версия 2.3.5)

Я раскомментировал строку в Config/core.php:

Configure::write('Routing.prefixes', array('admin'));

Я добавил строку в Config/routes.php: (Так же, как они советуют делать в кулинарной книге CakePHP.)

Router::connect('/admin', array('controller'=>'pages', 'action'=>'index','admin' => true));

В AppController.php у меня есть следующее:

    public $components = array(
    'Session',
    'Auth' => array(
        'loginRedirect'=>array('controller'=>'pages','action'=>'index', 'admin'=>true),
        'logoutRedirect'=>array('controller'=>'pages','action'=>'display','home'),
        'authError'=>'you have no access.',
        'authorize'=>array('Controller')
    )
);

Затем я добавил макет View/Pages/admin_index.ctp, в который я хочу перенаправить после входа в систему. Мне удалось войти в систему UsersController.php.

Итак, вопрос в том, где я должен перенаправить в AppController.php, чтобы получить зарегистрированный администратор admin_view? Я считаю, что loginRedirect как-то сломан.

Я изучил некоторые учебники по этому предмету, но я нашел только этот Youtube-видео http://www.youtube.com/watch?v=zvwQGZ1BxdM Все остальные учебники, похоже, касаются более ранних версии CakePHP.

Ответ 1

Я предполагаю, что вы можете установить loginAction в AppController, а затем внутри этого действия, которое вы могли бы сделать:

$this->redirect(array('controller'=>'someController','action'=>'someAction','admin'=>true));

Ответ 2

попробуйте это

    public $components = array(
    'Auth' => array(
        'autoRedirect' => false,
        'loginRedirect' => array(
            'admin' => true,
            'controller' => 'dashboard',
            'action' => 'index',
        ),

        'loginAction' => array(
            'controller' => 'users',
            'action' => 'login',
            'admin' => false,
            'plugin' => false,
        ),
    ),
);
    // Now the before Filter which tells it its okay to go to index/view/or display actions.
    public function beforeFilter() {    
    // Allow public views
    $this->Auth->allow('index', 'view', 'display');
    }

для входа в систему пользователя вы сделаете что-то вроде этого:

    public function login() {
    $this->set('title_for_layout', 'User Sign In');
     if ($this->request->is('post') || $this->request->is('put')) {
        if ($this->Auth->login()) {
                return $this->redirect($this->Auth->redirect());
        } else {
            $this->Session->setFlash('Username or password is incorrect', 'flash_bad');
        }
    }
}

любые методы, к которым вы хотите получить доступ, будут иметь публичную функцию admin_index, admin_view admin_settings и т.д., так что в контроллере виджетов маршрут будет /admin/widgets/index/admin/widgets/index и т.д. и так далее на. Уловка, позволяющая другим страницам отображаться без auth, просто помещает $this- > Auth- > allow в beforeFilter.

Ответ 3

У меня есть другое решение. Панель администратора для веб-сайта имеет другую графику, javasctipt и т.д., Поэтому я использую в своих папках приложения:

app_name
  +Model
  +Plugin
  +admin
  +front

Да, администратор находится в другой папке, поэтому я могу, например, установить еще один файл cookie для входа в админ-зону, только плагины и модель одинаковы. Эта структура папок нуждается в некоторой конфигурации в bootstrap.php:

  App::build(array(
      'Plugin' => array(ROOT . DS . 'Plugin' . DS),
      'Model' => array(ROOT . DS . 'Model' . DS),
      'Model/Behavior' => array(ROOT . DS . 'Model' . DS . 'Behavior' . DS),
  ));

Возможно, это безумие для вас, но я предпочитаю это решение, использующее маршруты администратора.

Ответ 4

Попробуйте это

Ваша конфигурация /routes.php

Router::connect('/', array('controller' => 'users', 'action' => 'dashboard' ));

AppController

class AppController extends Controller {

public $components = array(
    'Acl',
    'Session',
    'Auth' => array(
        'authenticate' => array(
            'Form' => array( 
                'userModel' => 'User',
                 'fields' => array(
                    'username' => 'user_name',
                    'password' => 'password'
                    )
                )
            ),
        'loginAction' => array('controller' => 'users', 'action' => 'login'),
                    'loginRedirect' => array('controller' => 'users', 'action' => 'mysettings'),
        'logoutRedirect' => array('controller' => 'users', 'action' => 'login'),
        'authError' => 'You don\'t have access here.',
                /*
                'loginAction' => array('controller' => 'users', 'action' => 'forgot_password'),
                'loginRedirect' => array('controller' => 'users', 'action' => 'dashboard'),
                'logoutRedirect' => array('controller' => 'users', 'action' => 'forgot_password'),
                'authError' => 'You don\'t have access here.',
                */
        ),

);

UserController

class UsersController extends AppController {

/**
 * Components
 *
 * @var array
 */ 
public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow('login','logout');
}

}