CakePHP AuthComponent не перенаправляет должным образом на Chrome


Я новичок на Cakephp,и я пытаюсь обойти его. Я строю простую систему аутентификации (login/logout). Im, используя в CakePHP строить-в AuthCommponent для этого.

Таблицы:

Пользователи: id / имя / фамилия|имя пользователя|пароль / роль

Роль=администратор / клиент.

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

Один пользователь (клиент) может просматривать/редактировать/удалять только себя. администратор может редактировать / просматривать / удалять каждый.

Итак, у меня есть build/

App / Controller / AppController

    <?php
    App::uses('Controller', 'Controller');
    class AppController extends Controller {
        public $helpers = array(
            'Html', 
            'Form',
            'Session',
            'Js'
        );
        public $components = array(
            'DebugKit.Toolbar',
            'Acl',
            'Cookie',
            'Session',
            'Security', 
            'Auth' => array(
                'loginAction' => array('controller' => 'users', 'action' => 'login'),
                'loginRedirect' => array('controller' => 'users', 'action' => 'index'),
                'logoutRedirect' => array('controller' => 'users', 'action' => 'login'),
                'authError' => 'Youd dont have permission for that action.',
                'loginError' => 'Invalid Username or Password entered, please try again.',
                'authorize'=>array('Controller'),
            )
        );



        /*****************************************************
        *               AUTHORIZATION
        ******************************************************/
        public function isAuthorized($user = null) {        
            if (isset($user['role']) && ($user['role'] === 'admin')) 
            {       
                return true;
            }   
            //default deny
            return false;
        }

        /*****************************************************
        *               BEFORE FILTER FUNCTION
        ******************************************************/
        public function beforeFilter() {
            parent::beforeFilter();
            $this->Auth->allow('display');
            $this->set('logged_in', $this->Auth->loggedIn()); 
            $this->set('current_user', $this->Auth->user());

            if (!$this->Auth->loggedIn()) {
                $this->Auth->authError = "You must be logged in to view this page!";
            }

        }

    } 
?>

Модель пользователя выглядит следующим образом:

Приложение / Модель / Пользователь

<?php
App::uses('AppModel', 'Model');
class User extends AppModel {

/**
 * Display field
 *
 * @var string
 */
    public $displayField = 'name';

/**
 * Validation rules
 *
 * @var array
 */
    public $validate = array(

        'id' => array(
            'blank' => array(
                'rule' => 'blank',
                'on' => 'create',
            ),
        ),
        'name' => array(
            'maxLength' => array(
                'rule' => array('maxLength', 50),
                'message' => 'Il nome utente non può superare i 50 caratteri.',
            ),
            'notEmpty' => array(
                'rule' => array('notEmpty'),
                'message' => 'Il nome utente non può essere vuoto.',
                'allowEmpty' => false
            ),
        ),
        'surname' => array(
            'maxLength' => array(
                'rule' => array('maxLength', 50),
                'message' => 'Il nome utente non può superare i 50 caratteri.',
            ),
            'notEmpty' => array(
                'rule' => array('notEmpty'),
                'message' => 'Il nome utente non può essere vuoto.',
                'allowEmpty' => false
            ),
        ),
        'username' => array(
            'maxLength' => array(
                'rule' => array('maxLength' , 50),
                'message' => 'Username non può superare i 50 caratteri.',
            ),
            'notEmpty' => array(
                'rule' => array('notEmpty'),
                'message' => 'Username non può essere vuoto.',
                'allowEmpty' => false
            ),
            'isUnique' => array(
                'rule' => 'isUnique',
                'message' => 'Questo utente già esiste.',
            ),
        ),
        'password' => array(
            'notEmpty' => array(
                'rule' => array('notEmpty'),
                'message' => 'Password can't be empty',
            ),
            'minLength' => array(
                'rule' => array('minLength',5),
                'message' => 'Password should be more then 5 characters long',
            ),
           'matchPasswords'=>array(
                'rule'=>'matchPasswords',
                'message'=>'La password non corrisponde!'
            ),
        ),
        'confirm_password'=>array(
            'notEmpty'=>array(
                'rule'=> array('notEmpty'),
                'message'=>'Confermare la password.'
            ),
         ),
        'role' => array(
            'notEmpty' => array(
                'rule' => array('notEmpty'),
                'message' => 'Non deve essere vuoto.',
            ),
            'words' => array(
                'rule' => array('custom', '/[0-9A-Za-z._-]/'),
                'message' => 'Username può contenere solo lettere, numeri e spazi.',
            ),          
            'valid' => array(
                'rule' => array('inList', array('admin', 'client')),
                'message' => 'Inserire un valido ruolo!',
                'allowEmpty' => false,
            ),
        ),
    );
/*****************************************************
* CHECK IF USER TYPES CORRECT THE PASSWORD - REGISTER
******************************************************/
    public function matchPasswords($data) {
        if ($data['password'] == $this->data['User']['confirm_password']) {
            return true;
        }
        $this->invalidate('confirm_password', 'La password non corrisponde!');
        return false;
    }       
/*****************************************************
*       BEFORE SAVE
******************************************************/
    // this is a Global variablke that im gonna use it inside my function
    public function beforeSave($options = array()) {
        // Adding new user
        if (isset($this->data[$this->alias]['password'])) { 
            //[$this->alias] is instead of ['User']
           $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
        }   
        return true;
    }
}
?>

И UserController:

App / Controller / UsersController

<?php
App::uses('AppController', 'Controller');
class UsersController extends AppController {


public $uses = array('User');
public $helpers = array('Html', 'Form');
public $components = array('Paginator');

/**
 * beforeFilter method
  * @return void
 */
    public function beforeFilter() {
        parent::beforeFilter();         
        $this->Auth->allow('add','login','logout');
        $this->Auth->autoRedirect = false;  
    } 

/**
 * user authorization method
 * @return void
 */ 
    public function isAuthorized($user = null) {
        if ($this->action === 'index') {
            return true;
        }
        // All registered users can add posts
        if ($this->action === 'add') {
            return true;
        }
        // The owner of a post can edit and delete it
        if (in_array($this->action, array('view','edit', 'delete'))) {
            // debug($this->request->params['pass']);
            $user_id =(int)$this->request->params['pass'][0];
            $logged_in_user = (int)$user['id'];
            if ($user_id === $logged_in_user) {
                return true;
            }
        }
        return parent::isAuthorized($user);
    }


/**
 * login method
  * @return void
 */
    public function login() {
        if ($this->Session->read('Auth.User')) {
            $this->Session->setFlash('You are allredy logged in!');
            return $this->redirect($this->Auth->redirectUrl());
        }

        if ($this->request->is('post')) {
            if ($this->Auth->login()) {
                $this->Session->setFlash(__('You Have Been Logged in.'));
                return $this->redirect($this->Auth->redirectUrl());
            } else { 
                $this->Session->setFlash(__('Invalid username/email - Password Combination.')); 
            }
        }
    }


/**
 * logout method
  * @return void
 */
    public function logout() {
         $this->Auth->logout();
         $this->redirect($this->Auth->redirectUrl());
    }   

/**
 * index method
  * @return void
 */
    public function index() {
        $this->User->recursive = 0;
        $this->set('users', $this->Paginator->paginate());
    }

/**
 * view method
  * @throws NotFoundException
 * @param string $id
 * @return void
 */
    public function view($id = null) {
        // debug($this->params['action']);
        if (!$this->User->exists($id)) {
            throw new NotFoundException(__('Invalid user'));
        }
        $options = array('conditions' => array('User.' . $this->User->primaryKey => $id));
        $this->set('user', $this->User->find('first', $options));
    }

/**
 * add method
  * @return void
 */
    public function add() {
        if ($this->Session->read('Auth.User')) {
            $this->Session->setFlash('You are allredy Have an Account!');
            return $this->redirect($this->Auth->redirectUrl());
        }
        if ($this->request->is('post')) {
            $this->User->create();
            if ($this->User->validates()) {
                if ($this->User->save($this->request->data)) {
                    $this->Session->setFlash(__('The user has been saved.'));
                    return $this->redirect(array('action' => 'index'));

                } else {
                    $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
                }
            }
        }
    }


/**
 * edit method
  * @throws NotFoundException
 * @param string $id
 * @return void
 */
    public function edit($id = null) {
        if (!$this->User->exists($id)) {
            throw new NotFoundException(__('Invalid user'));
        }
        if ($this->request->is(array('post', 'put'))) {     
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash(__('The user has been saved.'));
                return $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
            }
        } else {
            $options = array('conditions' => array('User.' . $this->User->primaryKey => $id));
            $this->request->data = $this->User->find('first', $options);
        }
    }

/**
 * delete method
  * @throws NotFoundException
 * @param string $id
 * @return void
 */
    public function delete($id = null) {
        $this->User->id = $id;
        if (!$this->User->exists()) {
            throw new NotFoundException(__('Invalid user'));
        }
        $this->request->allowMethod('post', 'delete');
        if ($this->User->delete()) {
            $this->Session->setFlash(__('The user has been deleted.'));
        } else {
            $this->Session->setFlash(__('The user could not be deleted. Please, try again.'));
        }
        return $this->redirect(array('action' => 'index'));
    }
}
?>

=> у меня зарегистрировано два пользователя. 1) админ, 2) Клиент.

A) когда я регистрируюсь как администратор, работает нормально, b) Когда я регистрируюсь как клиент и пытаюсь просмотреть / отредактировать / удалить себя, это работает идеально, но когда я пытаюсь отредактировать другого пользователь, он отрицает действие (как он предполагает), но когда он перенаправляет, он перенаправляет не на страницу индекса, а в корневую папку приложения и генерирует ошибку.

У меня есть папка с именем cakeaproject, где мое заявление щелок.

http://localhost/cakeaproject/users/ 

И автор перенаправляет на:

http://localhost/cakeaproject/cakeaproject/users/ 

Missing Controller

Error:  CakeappprojectsController could not be found.

Error:  Create the class  CakeaprojectController below in file: appController CakeaprojectController.php
<?php
class  CakeaprojectController extends AppController {

}

И мой маршрут.php файл выглядит следующим образом:

Приложение / конфигурация / маршруты.php

    Router::connect('/', array('controller' => 'users', 'action' => 'index','home'));
    Router::connect('/login', array('controller' => 'users', 'action' => 'login'));
    Router::connect('/register', array('controller' => 'users', 'action' => 'add'));

    Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));
    CakePlugin::routes();
    require CAKE . 'Config' . DS . 'routes.php';
?>

И самое приятное, что на Moxilla / Safari (для рабочего стола)/Tourch работает нормально и дальше У Chrome / SeaMonkey / IE есть проблема.

2 2

2 ответа:

Я бы поместил его внутри вашего контроллера пользователей в afterRender (); фильтр, такой как:

Итак, в:

Приложение / Контроллер / UsersController.php

public function beforeRender() {
    parent::beforeRender(); 
    $this->Auth->unauthorizedRedirect = array('controller'=>'users','action'=>'index');
}

Для редактирования вашего unauthorizeRedirect, пожалуйста, смотрите : http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#AuthComponent::$unauthorizedRedirect

Итак, в вашем контроллере

'Auth' => array(
                'loginAction' => array('controller' => 'users', 'action' => 'login'),
                'loginRedirect' => array('controller' => 'users', 'action' => 'index'),
                'logoutRedirect' => array('controller' => 'users', 'action' => 'login'),
                'authError' => 'Youd dont have permission for that action.',
                'loginError' => 'Invalid Username or Password entered, please try again.',
                'authorize'=>array('Controller'),.
                'unauthorizedRedirect'=>array('controller'=>'yours','action'=>'...')

            )