2014-06-05 9 views
5

ich eine RESTful API entwickle mit CakePHP, Ich versuche, eine benutzerdefinierte Autorisierung zu implementieren, die Benutzer unter Verwendung von ACL genehmigen, sieht Code so etwas wieCakePHP benutzerdefinierte ACL Autorisierung acos verwenden, aros & aros_acos Acl Tabellen mit der Erweiterung api_

<?php 
App::uses('BaseAuthorize', 'Controller/Component/Auth'); 

class ApiAuthorize extends BaseAuthorize { 
    public function authorize($user, CakeRequest $request) { 
       $allowed = false; 
     $Acl = $this->_Collection->load('Acl'); 
     list($plugin, $userModel) = pluginSplit($this->settings['userModel']); 
     $action = $this->action($request); 

     $cacheName = 'permissions_' . strval($user['id']); 
     if (($permissions = Cache::read($cacheName, 'permissions')) === false) { 
      $permissions = array(); 
      Cache::write($cacheName, $permissions, 'permissions'); 
     } 
     if (!isset($permissions[$action])) { 
      $User = ClassRegistry::init($this->settings['userModel']); 
      $User->id = $user['id']; 
      $allowed = $Acl->check($User, $action); 
      $permissions[$action] = $allowed; 
      Cache::write($cacheName, $permissions, 'permissions'); 
      $hit = false; 
     } else { 
      $allowed = $permissions[$action]; 
      $hit = true; 
     } 
      return $allowed; 
    } 
} 

ich für die Website gleiche Datenbank verwende (mit croogo entwickelt) und API so bereits meine Datenbank hat acos, aros & aros_acos Tabellen der Website so für API bin ich erstellt ACL Tabellen mit api_ Erweiterung wie api_acos, api_aros & api_aros_api_acos

New Schema meiner ACL-Tabellen wird

CREATE TABLE IF NOT EXISTS `api_acos` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `parent_id` int(10) DEFAULT NULL, 
    `model` varchar(255) DEFAULT '', 
    `foreign_key` int(10) unsigned DEFAULT NULL, 
    `alias` varchar(255) DEFAULT '', 
    `lft` int(10) DEFAULT NULL, 
    `rght` int(10) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

CREATE TABLE IF NOT EXISTS `api_acos_api_aros` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `api_aro_id` int(10) unsigned NOT NULL, 
    `api_aco_id` int(10) unsigned NOT NULL, 
    `_create` char(2) NOT NULL DEFAULT '0', 
    `_read` char(2) NOT NULL DEFAULT '0', 
    `_update` char(2) NOT NULL DEFAULT '0', 
    `_delete` char(2) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

CREATE TABLE IF NOT EXISTS `api_aros` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `parent_id` int(10) DEFAULT NULL, 
    `model` varchar(255) DEFAULT '', 
    `foreign_key` int(10) unsigned DEFAULT NULL, 
    `alias` varchar(255) DEFAULT '', 
    `lft` int(10) DEFAULT NULL, 
    `rght` int(10) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

ich von hier https://github.com/FriendsOfCake/Authorize/blob/master/Controller/Component/Acl/HabtmDbAcl.php benutzerdefinierten ACL Klasse ist mit

Meine Frage ist, wo und wie kann ich meine neue Datenbanktabellen verwenden (api_acos, api_aros & api_aros_api_acos) für die ACL-Suche? Bitte zeigen Sie mir Code, von wo ich Referenz für benutzerdefinierte ACL-Autorisierung-Implementierung nehmen kann.

Antwort

2

Ich würde nur die vorhandenen Acl-Tabellen von Croogo mit einem anderen Wurzelknoten für API wiederverwenden.

Dies ist, was der Croogo-Kern auch tut. Leider bieten die Installationsdaten dies nicht standardmäßig.

können Sie erstellen die api Wurzelknoten durch die Acl.extras Shell ausgeführt wird:

$ Console/cake acl.extras aco_sync 

Welcome to CakePHP v2.5.1 Console 
--------------------------------------------------------------- 
App : croogo-app 
Path: /home/rachman/work/personal/deploy/croogo-app/ 
--------------------------------------------------------------- 
Skipped Aco node: controllers/Croogo/CroogoError 
Created Aco node: controllers/Extensions/ExtensionsDashboard 
Created Aco node: controllers/Extensions/ExtensionsDashboard/admin_index 
Created Aco node: controllers/Extensions/ExtensionsPlugins/admin_moveup 
Created Aco node: controllers/Extensions/ExtensionsPlugins/admin_movedown 
Created Aco node: controllers/Menus/Links/admin_link_chooser 
Created Aco node: controllers/Menus/Menus/admin_toggle 
Created Aco node: controllers/Meta/Meta 
Created Aco node: controllers/Meta/Meta/admin_delete_meta 
Created Aco node: controllers/Meta/Meta/admin_add_meta 
Created Aco node: api/v1_0/Nodes/Nodes/lookup 
Created Aco node: api/v1_0/Users/Users/lookup 
Created Aco node: controllers/Wysiwyg 
Aco Sync Complete 

Sie können manuell die notwendigen ACOs wie pro Ihre API Anforderungen hinzufügen oder den ApiComponent als Basis benutzen, die die Extras ermöglicht Shell um es für später automatisch zu erstellen.

Die UserApiComponent und können ein Beispiel für die Implementierung von API-Methoden bereitstellen.