CakePHP 2.x ACL Проблемы, заставляющие это работать

Я пытался заставить ACL CakePHP работать с моим новым приложением, это причиняет мне боль. По какой-то причине ACL, похоже, не работает, однако учебники являются мусором и не очень хорошо объясняют каждый компонент. например как ACO связывается с контроллером / функцией / представлениями

У меня есть ACL, работающий правильно до тех пор, пока страницы не узнают, разрешено ли пользователю просматривать его, также проблема с пунктами меню, которые они могут / не могут видеть.

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

$user = $this->Auth->user();
pr($user);

Возвращенный массив:

Array
(
[id] => 80
[first_name] => Bob
[last_name] => Test
[email] => email@emial.com
[username] => TestAdmin
[tokenhash] => cleared
[is_active] => 1
[created] => 2014-10-03 16:32:45
[modified] => 2014-10-03 16:32:45
[token_expires_at] =>
[group_id] => 3
[Group] => Array
(
[id] =>
[name] =>
[enabled] =>
[created] =>
[modified] =>
)

)

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

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

заранее спасибо

РЕДАКТИРОВАТЬ:

Я обновил свой AppController, как показано ниже, и он начал показывать группу в массиве, как следует !!! странное спасибо за толчок в правильном направлении.

AppController.php

<?php

App::uses('Controller', 'Controller');

class AppController extends Controller {
public function beforeRender() {
if((($this->params['controller']==='Users') || ($this->params['controller']==='users'))&&(($this->params['action']=='login') || ($this->params['action']=='register') || ($this->params['action']=='success') || ($this->params['action']=='forgot_password') || ($this->params['action']=='reset_password')) ){
$this->theme = 'DataHouseLogin';
}else{
$this->theme = 'DataHouse';
}
parent::beforeRender();
}

public $components = array(
'Acl',
'RequestHandler',
'DebugKit.Toolbar' => array('panels' => array('history' => false)),
'Session',
'Auth' => array(
'authorize' => array(
'Actions' => array(
'actionPath' => 'controllers'
)
),
'loginAction' => array(
'controller' => 'Users',
'action' => 'login'
),
'loginRedirect' => array(
'controller' => 'Dashboard',
'action' => 'index'
),
'logoutRedirect' => array(
'controller' => 'Users',
'action' => 'login'
),
'authError' => 'Did you really think you are allowed to see that?',
'authenticate' => array(
'Form' => array(
'passwordHasher' => 'Blowfish'
)
)
)
);

public function beforeFilter() {
//$this->Auth->allowedActions = array('display','index','register');
$this->set('user', $this->Auth->user());
$this->set('acl', $this->Acl);
$this->Auth->authorize = array(
'Controller',
'Actions' => array('actionPath' => 'controllers')
);parent::beforeFilter();
}
public function isAuthorized($user) {
// Default deny
return false;
}
}

1

Решение

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

class AppController extends Controller {
public $components = array('RequestHandler', 'Session',
'Acl',
'Auth' => array(
'authorize' => array(
'Actions' => array('actionPath' => 'controllers')
)
),
);

public function beforeFilter() {
$this->Auth->authorize = array(
'Controller',
'Actions' => array('actionPath' => 'controllers')
);
$this->Auth->authenticate = array('Form' => array('fields' => array('username' => 'name', 'password' => 'password')));
$this->Auth->loginAction = array('controller' => 'users', 'action' => 'login', 'admin' => false, 'plugin' => false);
$this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login', 'admin' => false, 'plugin' => false);
}

public function isAuthorized($user) {
// Default deny
return false;
}
}

РЕДАКТИРОВАТЬ:
в UserModel и GroupModel add действуют как свойства:

public $actsAs = array('Acl' => array('type' => 'requester'));

в настройке UserModel функция parentNode:

public function parentNode() {
if (!$this->id && empty($this->data)) {
return null;
}
if (isset($this->data['User']['group_id'])) {
$groupId = $this->data['User']['group_id'];
} else {
$groupId = $this->field('group_id');
}
if (!$groupId) {
return null;
} else {
return array('Group' => array('id' => $groupId));
}
}
1

Другие решения

Других решений пока нет …