- 関数 build_acl() {
- ? ?? ?? ?? ?? ? if (!Configure::read('debug')) {
- ? ?? ?? ?? ?? ?? ?? ?? ?return $this->_stop();
- ? ?? ?? ?? ?? ? }
- ? ?? ?? ?? ?? ? $log = array();
- ? ?? ?? ?? ?? ? $aco =& $this->Acl->Aco;
- ? ?? ?? ?? ?? ? $root = $aco->node('コントローラー');
- ? ?? ?? ?? ?? ? if (!$root) {
- ? ?? ?? ?? ?? ?? ?? ?? ?$aco->create(array('parent_id' => null, 'model' => null, 'alias' => 'controllers'));
- ? ?? ?? ?? ?? ?? ?? ?? ?$root = $aco->save();
- ? ?? ?? ?? ?? ?? ?? ?? ?$root['Aco']['id'] = $aco->id;
- ? ?? ?? ?? ?? ?? ?? ?? ?$log[] = 'コントローラー用の Aco ノードを作成しました';
- ? ?? ?? ?? ?? ? } else {
- ? ?? ?? ?? ?? ?? ?? ?? ?$root = $root[0];
- ? ?? ?? ?? ?? ? }? ?
- ? ?? ?? ?? ?? ? App::import('コア', 'ファイル');
- ? ?? ?? ?? ?? ? $Controllers = Configure::listObjects('controller');
- ? ?? ?? ?? ?? ? $appIndex = array_search('App', $Controllers);
- ? ?? ?? ?? ?? ? if ($appIndex !== false ) {
- ? ?? ?? ?? ?? ?? ?? ?? ?unset($Controllers[$appIndex]);
- ? ?? ?? ?? ?? ? }
- ? ?? ?? ?? ?? ? $baseMethods = get_class_methods('コントローラー');
- ? ?? ?? ?? ?? ? $baseMethods[] = 'buildAcl';
- ? ?? ?? ?? ?? ? $Plugins = $this->_getPluginControllerNames();
- ? ?? ?? ?? ?? ? $Controllers = array_merge($Controllers, $Plugins);
- ? ?? ?? ?? ?? ? // app/controllers 内の各コントローラーを確認します
- ? ?? ?? ?? ?? ? foreach ($Controllers as $ctrlName) {
- ? ?? ?? ?? ?? ?? ?? ?? ?$methods = $this->_getClassMethods($this->_getPluginControllerPath($ctrlName));
- ? ?? ?? ?? ?? ?? ?? ?? ?// すべてのプラグインを最初に実行します
- ? ?? ?? ?? ?? ?? ?? ?? ?if ($this->_isPlugin($ctrlName)){
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$pluginNode = $aco->node('controllers/'.$this->_getPluginName($ctrlName));
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???if (!$pluginNode) {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?
$aco->create(array('parent_id' => $root['Aco']['id'], 'model'
=> null, 'エイリアス' => $this->_getPluginName($ctrlName)));
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $pluginNode = $aco->save();
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $pluginNode['Aco']['id'] = $aco->id;
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $log[] = ' の Aco ノードを作成しました。 $this->_getPluginName($ctrlName) 。 ' プラグイン';
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
- ? ?? ?? ?? ?? ?? ?? ?? ?}
- ? ?? ?? ?? ?? ?? ?? ?? ?// コントローラー ノードを検索 / 作成
- ? ?? ?? ?? ?? ?? ?? ?? ?$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'],
'モデル' => null, 'エイリアス' =>
$this->_getPluginControllerName($ctrlName)));
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $controllerNode = $aco->save();
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $controllerNode['Aco']['id'] = $aco->id;
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $log[] = 'Aco を作成しました
' のノード。 $this->_getPluginControllerName($ctrlName) 。 「 」。
$this->_getPluginName($ctrlName) 。 ' プラグイン コントローラー';
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???} else {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?
$aco->create(array('parent_id' => $root['Aco']['id'], 'model'
=> null, 'エイリアス' => $ctrlName));
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $controllerNode = $aco->save();
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $controllerNode['Aco']['id'] = $aco->id;
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $log[] = ' の Aco ノードを作成しました。 $ctrlName;
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
- ? ?? ?? ?? ?? ?? ?? ?? ?} else {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$controllerNode = $controllerNode[0];
- ? ?? ?? ?? ?? ?? ?? ?? ?}
- ? ?? ?? ?? ?? ?? ?? ?? ?//メソッドをクリーンアップします。コントローラーとプライベートアクション内のそれらを削除します。
- ? ?? ?? ?? ?? ?? ?? ?? ?foreach ($methods as $k => $method) {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???if (strpos($method, '_', 0) === 0) {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? unset($methods[$k]);
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?続行;
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???if (in_array($method, $baseMethods)) {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? unset($methods[$k]);
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?続行;
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$methodNode = $aco->node('controllers/'.$ctrlName.'/'.$method);
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???if (!$methodNode) {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?
$aco->create(array('parent_id' => $controllerNode['Aco']['id'],
'モデル' => null, 'エイリアス' => $method));
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $methodNode = $aco->save();
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $log[] = ' の Aco ノードを作成しました。 $メソッド;
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
- ? ?? ?? ?? ?? ?? ?? ?? ?}
- ? ?? ?? ?? ?? ? }
- ? ?? ?? ?? ?? ? if(count($log)>0) {
- ? ?? ?? ?? ?? ?? ?? ?? ?debug($log);
- ? ?? ?? ?? ?? ? }
- ? ?? ???}
- ? ?? ???function _getClassMethods($ctrlName = null) {
- ? ?? ?? ?? ?? ? App::import('コントローラー', $ctrlName);
- ? ?? ?? ?? ?? ? if (strlen(strstr($ctrlName, '.')) > 0) {
- ? ?? ?? ?? ?? ?? ?? ?? ?// プラグインのコントローラー
- ? ?? ?? ?? ?? ?? ?? ?? ?$num = strpos($ctrlName, '.');
- ? ?? ?? ?? ?? ?? ?? ?? ?$ctrlName = substr($ctrlName, $num+1);
- ? ?? ?? ?? ?? ? }
- ? ?? ?? ?? ?? ? $ctrlclass = $ctrlName 。 'コントローラー';
- ? ?? ?? ?? ?? ? $methods = get_class_methods($ctrlclass);
- ? ?? ?? ?? ?? ? // スキャフォールドが使用されている場合はスキャフォールドのデフォルトを追加しますsed
- ? ?? ?? ?? ?? ? $properties = get_class_vars($ctrlclass);
- ? ?? ?? ?? ?? ? if (array_key_exists('scaffold',$properties)) {
- ? ?? ?? ?? ?? ?? ?? ?? ?if($properties['scaffold'] == '管理者') {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$メソッド =
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'));
- ? ?? ?? ?? ?? ?? ?? ?? ?}
- ? ?? ?? ?? ?? ? }
- ? ?? ?? ?? ?? ? $methods を返す;
- ? ?? ???}
- ? ?? ???function _isPlugin($ctrlName = null) {
- ? ?? ?? ?? ?? ? $arr = String::tokenize($ctrlName, '/');
- ? ?? ?? ?? ?? ? if (count($arr) > 1) {
- ? ?? ?? ?? ?? ?? ?? ?? ?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;
- ? ?? ?? ?? ?? ? }
- ? ?? ???}
- /**
- * プラグイン コントローラーの名前を取得します ...
- *
- * この関数はプラグイン コントローラー名の配列を取得します。
- * また、
を取得するためにコントローラーが利用可能であることも確認します。
- * 各プラグイン コントローラーに対して App::import を実行することによるメソッド名。
- *
- * @return プラグイン名の配列。
- *
- */
- ? ?? ???function _getPluginControllerNames() {
- ? ?? ?? ?? ?? ? App::import('コア', 'ファイル', 'フォルダー');
- ? ?? ?? ?? ?? ? $paths = 構成::getInstance();
- ? ?? ?? ?? ?? ? $folder =& 新しいフォルダー();
- ? ?? ?? ?? ?? ? $folder->cd(APP . 'plugins');
- ? ?? ?? ?? ?? ? // プラグインのリストを取得します
- ? ?? ?? ?? ?? ? $Plugins = $folder->read();
- ? ?? ?? ?? ?? ? $Plugins = $Plugins[0];
- ? ?? ?? ?? ?? ? $arr = array();
- ? ?? ?? ?? ?? ? // プラグインをループします
- ? ?? ?? ?? ?? ? foreach($Plugins as $pluginName) {
- ? ?? ?? ?? ?? ?? ?? ?? ?// ディレクトリをプラグインに変更します
- ? ?? ?? ?? ?? ?? ?? ?? ?$didCD = $folder->cd(APP . 'plugins'. DS . $pluginName . DS . 'controllers');
- ? ?? ?? ?? ?? ?? ?? ?? ?// ファイル名が
で終わるファイルのリストを取得します。
- ? ?? ?? ?? ?? ?? ?? ?? ?//controller.php
を使用
- ? ?? ?? ?? ?? ?? ?? ?? ?$files = $folder->findRecursive('.*_controller.php');
- ? ?? ?? ?? ?? ?? ?? ?? ?// プラグイン ディレクトリで見つかったコントローラーをループします
- ? ?? ?? ?? ?? ?? ?? ?? ?foreach($files as $fileName) {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???// ベースファイル名を取得します
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$file = ベース名($fileName);
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???// コントローラー名を取得します
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$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('プラグイン '.$pluginName の '.$file.' インポート中にエラーが発生しました);
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? } else {
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?/// プラグイン名を先頭に追加します ...
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?// これはメソッド名を取得できるようにするために必要です。
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?$arr[] = Inflector::humanize($pluginName) 。 「/」。 $file;
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? }
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
- ? ?? ?? ?? ?? ?? ?? ?? ?}
- ? ?? ?? ?? ?? ? }
- ? ?? ?? ?? ?? ? $arr を返す;
- ? ?? ???}
增加好以后我们打开浏览器访问刚才的方法
比如我的http://localhost/cakephp/users/build_acl
実行後のプログラムは、すべてのコントローラーのアクションをすべて acos テーブルに自動的に追加します。
など、acos テーブルの起動時に確認できます。
次来应该是做我们最兴奋的事情了,就是实现权制限制御,故我们前期標準备工作都做好了,最终我们都是了实现可制御权制限
1.? ?? ???先来介绍下语法,允许访问$this->Acl->allow($aroAlias, $acoAlias);
廝访问$this->Acl->deny($aroAlias, $acoAlias);
先は aros_acos 表中見下、今まではこの表を停止しています、これは承認されていません
我们可写一初期化関数
我同样把この段代网在ユーザー制御器中
- 関数 initDB() {
- ? ? $group =& $this->ユーザー->グループ;
- ? ? //管理者にすべてを許可します
- ? ? $group->id = 1;? ???
- ? ? $this->Acl->allow($group, 'controllers');
-
- ? ? // 管理者に投稿とウィジェットを許可します
- ? ? $group->id = 2;
- ? ? $this->Acl->deny($group, 'controllers');
- ? ? $this->Acl->allow($group, 'controllers/Posts');
- ? ? $this->Acl->allow($group, 'コントローラー/ウィジェット');
-
- ? ? //ユーザーに投稿とウィジェットの追加と編集のみを許可します
- ? ? $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');
- }
次来我们在浏览器中访问この行動
これは時間です你就应该発行现你的 aros_acos 表中多了很多条记录,哈哈,これは acl の秘密の場所です。
次に、異なるグループのユーザー名登録を使用することもできますし、initDB エリアのコードを変更してテストを行うこともできます。これは、実際の作業でどのように使用するかについて、那就要見你自己的了、最後祝大家工作愉快!这在这里,有兴趣的朋友可下載
cakephp中acl详解.rar
转下自: バッテリーラップトップ