- function build_acl() {
- ? ?? ?? ?? ?? ? if (!Configure::read('debug')) {
- ? ?? ?? ?? ?? ?? ?? ?? ?return $this->_stop();
- ? ?? ?? ?? ?? ? }
- ? ?? ?? ?? ?? ? $log = array();
- ? ?? ?? ?? ?? ? $aco =& $this->Acl->Aco;
- ? ?? ?? ?? ?? ? $root = $aco->node('controllers');
- ? ?? ?? ?? ?? ? if (!$root) {
- ? ?? ?? ?? ?? ?? ?? ?? ?$aco->create(array('parent_id' => null, 'model' => null, 'alias' => 'controllers'));
- ? ?? ?? ?? ?? ?? ?? ?? ?$root = $aco->save();
- ? ?? ?? ?? ?? ?? ?? ?? ?$root['Aco']['id'] = $aco->id;
- ? ?? ?? ?? ?? ?? ?? ?? ?$log[] = 'Created Aco node for controllers';
- ? ?? ?? ?? ?? ? } else {
- ? ?? ?? ?? ?? ?? ?? ?? ?$root = $root[0];
- ? ?? ?? ?? ?? ? }? ?
- ? ?? ?? ?? ?? ? App::import('Core', 'File');
- ? ?? ?? ?? ?? ? $Controllers = Configure::listObjects('controller');
- ? ?? ?? ?? ?? ? $appIndex = array_search('App', $Controllers);
- ? ?? ?? ?? ?? ? if ($appIndex !== false ) {
- ? ?? ?? ?? ?? ?? ?? ?? ?unset($Controllers[$appIndex]);
- ? ?? ?? ?? ?? ? }
- ? ?? ?? ?? ?? ? $baseMethods = get_class_methods('Controller');
- ? ?? ?? ?? ?? ? $baseMethods[] = 'buildAcl';
- ? ?? ?? ?? ?? ? $Plugins = $this->_getPluginControllerNames();
- ? ?? ?? ?? ?? ? $Controllers = array_merge($Controllers, $Plugins);
- ? ?? ?? ?? ?? ? // look at each controller in app/controllers
- ? ?? ?? ?? ?? ? foreach ($Controllers as $ctrlName) {
- ? ?? ?? ?? ?? ?? ?? ?? ?$methods = $this->_getClassMethods($this->_getPluginControllerPath($ctrlName));
- ? ?? ?? ?? ?? ?? ?? ?? ?// Do all Plugins First
- ? ?? ?? ?? ?? ?? ?? ?? ?if ($this->_isPlugin($ctrlName)){
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$pluginNode = $aco->node('controllers/'.$this->_getPluginName($ctrlName));
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???if (!$pluginNode) {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $aco->create(array('parent_id' => $root['Aco']['id'], 'model' => null, 'alias' => $this->_getPluginName($ctrlName)));
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $pluginNode = $aco->save();
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $pluginNode['Aco']['id'] = $aco->id;
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $log[] = 'Created Aco node for ' . $this->_getPluginName($ctrlName) . ' Plugin';
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
- ? ?? ?? ?? ?? ?? ?? ?? ?}
- ? ?? ?? ?? ?? ?? ?? ?? ?// find / make controller node
- ? ?? ?? ?? ?? ?? ?? ?? ?$controllerNode = $aco->node('controllers/'.$ctrlName);
- ? ?? ?? ?? ?? ?? ?? ?? ?if (!$controllerNode) {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???if ($this->_isPlugin($ctrlName)){
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $pluginNode = $aco->node('controllers/' . $this->_getPluginName($ctrlName));
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $aco->create(array('parent_id' => $pluginNode['0']['Aco']['id'], 'model' => null, 'alias' => $this->_getPluginControllerName($ctrlName)));
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $controllerNode = $aco->save();
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $controllerNode['Aco']['id'] = $aco->id;
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $log[] = 'Created Aco node for ' . $this->_getPluginControllerName($ctrlName) . ' ' . $this->_getPluginName($ctrlName) . ' Plugin Controller';
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???} else {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $aco->create(array('parent_id' => $root['Aco']['id'], 'model' => null, 'alias' => $ctrlName));
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $controllerNode = $aco->save();
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $controllerNode['Aco']['id'] = $aco->id;
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $log[] = 'Created Aco node for ' . $ctrlName;
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
- ? ?? ?? ?? ?? ?? ?? ?? ?} else {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$controllerNode = $controllerNode[0];
- ? ?? ?? ?? ?? ?? ?? ?? ?}
- ? ?? ?? ?? ?? ?? ?? ?? ?//clean the methods. to remove those in Controller and private actions.
- ? ?? ?? ?? ?? ?? ?? ?? ?foreach ($methods as $k => $method) {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???if (strpos($method, '_', 0) === 0) {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? unset($methods[$k]);
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? continue;
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???if (in_array($method, $baseMethods)) {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? unset($methods[$k]);
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? continue;
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$methodNode = $aco->node('controllers/'.$ctrlName.'/'.$method);
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???if (!$methodNode) {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $aco->create(array('parent_id' => $controllerNode['Aco']['id'], 'model' => null, 'alias' => $method));
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $methodNode = $aco->save();
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $log[] = 'Created Aco node for '. $method;
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
- ? ?? ?? ?? ?? ?? ?? ?? ?}
- ? ?? ?? ?? ?? ? }
- ? ?? ?? ?? ?? ? if(count($log)>0) {
- ? ?? ?? ?? ?? ?? ?? ?? ?debug($log);
- ? ?? ?? ?? ?? ? }
- ? ?? ???}
- ? ?? ???function _getClassMethods($ctrlName = null) {
- ? ?? ?? ?? ?? ? App::import('Controller', $ctrlName);
- ? ?? ?? ?? ?? ? if (strlen(strstr($ctrlName, '.')) > 0) {
- ? ?? ?? ?? ?? ?? ?? ?? ?// plugin's controller
- ? ?? ?? ?? ?? ?? ?? ?? ?$num = strpos($ctrlName, '.');
- ? ?? ?? ?? ?? ?? ?? ?? ?$ctrlName = substr($ctrlName, $num+1);
- ? ?? ?? ?? ?? ? }
- ? ?? ?? ?? ?? ? $ctrlclass = $ctrlName . 'Controller';
- ? ?? ?? ?? ?? ? $methods = get_class_methods($ctrlclass);
- ? ?? ?? ?? ?? ? // Add scaffold defaults if scaffolds are being used
- ? ?? ?? ?? ?? ? $properties = get_class_vars($ctrlclass);
- ? ?? ?? ?? ?? ? if (array_key_exists('scaffold',$properties)) {
- ? ?? ?? ?? ?? ?? ?? ?? ?if($properties['scaffold'] == 'admin') {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$methods = array_merge($methods, array('admin_add', 'admin_edit', 'admin_index', 'admin_view', 'admin_delete'));
- ? ?? ?? ?? ?? ?? ?? ?? ?} else {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$methods = array_merge($methods, array('add', 'edit', 'index', 'view', 'delete'));
- ? ?? ?? ?? ?? ?? ?? ?? ?}
- ? ?? ?? ?? ?? ? }
- ? ?? ?? ?? ?? ? return $methods;
- ? ?? ???}
- ? ?? ???function _isPlugin($ctrlName = null) {
- ? ?? ?? ?? ?? ? $arr = String::tokenize($ctrlName, '/');
- ? ?? ?? ?? ?? ? if (count($arr) > 1) {
- ? ?? ?? ?? ?? ?? ?? ?? ?return true;
- ? ?? ?? ?? ?? ? } else {
- ? ?? ?? ?? ?? ?? ?? ?? ?return false;
- ? ?? ?? ?? ?? ? }
- ? ?? ???}
- ? ?? ???function _getPluginControllerPath($ctrlName = null) {
- ? ?? ?? ?? ?? ? $arr = String::tokenize($ctrlName, '/');
- ? ?? ?? ?? ?? ? if (count($arr) == 2) {
- ? ?? ?? ?? ?? ?? ?? ?? ?return $arr[0] . '.' . $arr[1];
- ? ?? ?? ?? ?? ? } else {
- ? ?? ?? ?? ?? ?? ?? ?? ?return $arr[0];
- ? ?? ?? ?? ?? ? }
- ? ?? ???}
- ? ?? ???function _getPluginName($ctrlName = null) {
- ? ?? ?? ?? ?? ? $arr = String::tokenize($ctrlName, '/');
- ? ?? ?? ?? ?? ? if (count($arr) == 2) {
- ? ?? ?? ?? ?? ?? ?? ?? ?return $arr[0];
- ? ?? ?? ?? ?? ? } else {
- ? ?? ?? ?? ?? ?? ?? ?? ?return false;
- ? ?? ?? ?? ?? ? }
- ? ?? ???}
- ? ?? ???function _getPluginControllerName($ctrlName = null) {
- ? ?? ?? ?? ?? ? $arr = String::tokenize($ctrlName, '/');
- ? ?? ?? ?? ?? ? if (count($arr) == 2) {
- ? ?? ?? ?? ?? ?? ?? ?? ?return $arr[1];
- ? ?? ?? ?? ?? ? } else {
- ? ?? ?? ?? ?? ?? ?? ?? ?return false;
- ? ?? ?? ?? ?? ? }
- ? ?? ???}
- /**
- * Get the names of the plugin controllers ...
- *
- * This function will get an array of the plugin controller names, and
- * also makes sure the controllers are available for us to get the
- * method names by doing an App::import for each plugin controller.
- *
- * @return array of plugin names.
- *
- */
- ? ?? ???function _getPluginControllerNames() {
- ? ?? ?? ?? ?? ? App::import('Core', 'File', 'Folder');
- ? ?? ?? ?? ?? ? $paths = Configure::getInstance();
- ? ?? ?? ?? ?? ? $folder =& new Folder();
- ? ?? ?? ?? ?? ? $folder->cd(APP . 'plugins');
- ? ?? ?? ?? ?? ? // Get the list of plugins
- ? ?? ?? ?? ?? ? $Plugins = $folder->read();
- ? ?? ?? ?? ?? ? $Plugins = $Plugins[0];
- ? ?? ?? ?? ?? ? $arr = array();
- ? ?? ?? ?? ?? ? // Loop through the plugins
- ? ?? ?? ?? ?? ? foreach($Plugins as $pluginName) {
- ? ?? ?? ?? ?? ?? ?? ?? ?// Change directory to the plugin
- ? ?? ?? ?? ?? ?? ?? ?? ?$didCD = $folder->cd(APP . 'plugins'. DS . $pluginName . DS . 'controllers');
- ? ?? ?? ?? ?? ?? ?? ?? ?// Get a list of the files that have a file name that ends
- ? ?? ?? ?? ?? ?? ?? ?? ?// with controller.php
- ? ?? ?? ?? ?? ?? ?? ?? ?$files = $folder->findRecursive('.*_controller\.php');
- ? ?? ?? ?? ?? ?? ?? ?? ?// Loop through the controllers we found in the plugins directory
- ? ?? ?? ?? ?? ?? ?? ?? ?foreach($files as $fileName) {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???// Get the base file name
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$file = basename($fileName);
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???// Get the controller name
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$file = Inflector::camelize(substr($file, 0, strlen($file)-strlen('_controller.php')));
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???if (!preg_match('/^'. Inflector::humanize($pluginName). 'App/', $file)) {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? if (!App::import('Controller', $pluginName.'.'.$file)) {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?debug('Error importing '.$file.' for plugin '.$pluginName);
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? } else {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?/// Now prepend the Plugin name ...
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?// This is required to allow us to fetch the method names.
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?$arr[] = Inflector::humanize($pluginName) . "/" . $file;
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? }
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
- ? ?? ?? ?? ?? ?? ?? ?? ?}
- ? ?? ?? ?? ?? ? }
- ? ?? ?? ?? ?? ? return $arr;
- ? ?? ???}
增加好以后我们打开浏览器访问刚才的方法
比如我的http://localhost/cakephp/users/build_acl
运行后程序会自动把所有controller下的action都添加到acos表中,你现在打开acos表应该就会看到很多记录了,如
接下来应该是做我们最兴奋的事情了,就是实现权限控制,因为我们前期准备工作都做好了,最终我们都是为了实现可以控制权限
1.? ?? ???先来介绍下语法,允许访问$this->Acl->allow($aroAlias, $acoAlias);
拒绝访问$this->Acl->deny($aroAlias, $acoAlias);
你先打开aros_acos表中看下,到目前为止该表应该还是没有记录的
我们可以写一个初始化函数
我同样把这段代码放在user控制器中
- function initDB() {
- ? ? $group =& $this->User->Group;
- ? ? //Allow admins to everything
- ? ? $group->id = 1;? ???
- ? ? $this->Acl->allow($group, 'controllers');
-
- ? ? //allow managers to posts and widgets
- ? ? $group->id = 2;
- ? ? $this->Acl->deny($group, 'controllers');
- ? ? $this->Acl->allow($group, 'controllers/Posts');
- ? ? $this->Acl->allow($group, 'controllers/Widgets');
-
- ? ? //allow users to only add and edit on posts and widgets
- ? ? $group->id = 3;
- ? ? $this->Acl->deny($group, 'controllers');? ?? ???
- ? ? $this->Acl->allow($group, 'controllers/Posts/add');
- ? ? $this->Acl->allow($group, 'controllers/Posts/edit');? ?? ???
- ? ? $this->Acl->allow($group, 'controllers/Widgets/add');
- ? ? $this->Acl->allow($group, 'controllers/Widgets/edit');
- }
接下来我们在浏览器中访问这个action
这个是时候你就应该发现你的aros_acos表中多了很多条记录,哈哈,这个就是acl的秘密所在.
接下来你可以使用不同组的用户名登录访问,你还可以修改initDB里面的代码进行测试,至于实际工作中如何使用,那就要看你自己的了,最后祝大家工作愉快!最后我把文档放在这里,有兴趣的朋友可以下载cakephp中acl详解.rar
转载自: Batterylaptops