2014-10-08 1 views
1

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

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

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

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

возвращаемого массива:

Array 
(
    [id] => 80 
    [first_name] => Bob 
    [last_name] => Test 
    [email] => [email protected] 
    [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] => 
     ) 

) 

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

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

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

EDIT:

Я обновил свой 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; 
    } 
} 
+0

Вы сконфигурированной ACL и Auth компоненты? Покажите мне свою функцию AppController-> beforeFilter(), пожалуйста. –

+0

Привет, Grzegorz, я добавил файл beforeFilter. –

ответ

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; 
} 
} 

EDIT: в UserModel и GroupModel добавить акт как собственность:

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)); 
    } 
} 
+0

Я изменил это и теперь больше не могу войти в приложение –

+0

Вы должны правильно настроить свой ACL, возможно использовать компонент Auth без ACL, но в этом случае вы должны вручную ввести логику авторизации в isAuthorized. Прочтите [this - auth example] (http://book.cakephp.org/2.0/en/tutorials-and-examples/blog-auth-example/auth.html) статью, и вам будет более понятно –

+0

hmm yes хорошо, я сделал это и до того, как начал внедрять ACL, все это работало очень хорошо, поэтому ACL просто не подходит. –

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

  • Нет связанных вопросов^_^