ホームページ >バックエンド開発 >PHPチュートリアル >Cakephp の ACL と認証の詳細な説明

Cakephp の ACL と認証の詳細な説明

WBOY
WBOYオリジナル
2016-06-13 13:02:001016ブラウズ

CakephpのACLとAUTHの詳しい説明

自己学習ケーキphp それ以来、私は acl を完全に理解することができませんでした。私は多くの情報を確認しましたが、acl の使用法は、過去にマニュアルを読み直して理解するのが比較的難しい部分であるはずです。数日して、ACL を信じていないことに気づきました。難しいですが、想像していたよりも簡単です。ぜひ転載して、私の Web サイト http://www.batterylaptops.co.uk をご覧ください。
具体的な使い方と使用時の注意点についてお話します
準備作業:
ベイク名が有効になるようにベイクを設定するのが最善です。これは必須ではありませんが、将来的にはこのコマンド ライン ツール
を使用するとさらに便利になります。 データベース内 次の SQL ステートメントをインポートします

  1. CREATE TABLE ユーザー (
  2. ? ID INT(11) は NULL ではありません AUTO_INCREMENT 主キー、
  3. ?? ユーザー名 VARCHAR(255) が NULL ではありません、
  4. ? パスワード CHAR(40) が NULL ではありません、
  5. ? グループ ID INT(11) が NULL ではありません、
  6. を作成しましたか?
  7. ?変更日時
  8. );


  9. CREATE TABLE グループ (
  10. ? ID INT(11) は NULL ではありません AUTO_INCREMENT 主キー、
  11. ? 名前 VARCHAR(100) が NULL ではありません、
  12. を作成しましたか?
  13. ?変更日時
  14. );


  15. CREATE TABLE 投稿 (
  16. ? ID INT(11) は NULL ではありません AUTO_INCREMENT 主キー、
  17. ? user_id INT(11) が NULL ではありません、
  18. ? タイトル VARCHAR(255) が NULL ではありません、
  19. ?本文テキスト、
  20. を作成しましたか?
  21. ?変更日時
  22. );

  23. CREATE TABLE ウィジェット (
  24. ? ID INT(11) は NULL ではありません AUTO_INCREMENT 主キー、
  25. ? 名前 VARCHAR(100) が NULL ではありません、
  26. ?part_no VARCHAR(12)、
  27. ? 数量 INT(11)
  28. );

ここでは、cake Bake all コマンドツールを使用して、モデル、コントローラー、ビューをすばやく生成します (ここでは、cakephp での Bake コマンドの使用方法を詳しく紹介します)


次のステップでは、認証コンポーネント authentication を使用する準備をします。
まず、users_controller.php を開き、UsersController クラスにログインとログアウトのアクションを追加します

  1. 関数ログイン() {
  2. ? //認証マジック
  3. }

  4. 関数 logout() {
  5. ? // 今は空のままにしておきます。
  6. }
  7. 次に、ビュー ファイル を作成します。 app/views/users/login.ctp
  8. $session->flash('auth');
  9. echo $form->create('User', array('action' => 'login'));
  10. echo $form->inputs(array(
  11. ? ??'凡例' => __('ログイン'、true)、
  12. ????'ユーザー名'、
  13. ????'パスワード'
  14. ));
  15. echo $form->end('Login');

  16. ?>

次のステップでは、AppController (/app/app_controller.php) を変更する必要があります。アプリ ディレクトリに app_controller.php ファイルがない場合は、自分で作成できます。

  1. クラス AppController はコントローラ {
    を拡張します
  2. ? var $components = array('Acl', 'Auth');

  3. ? beforeFilter() 関数 {
  4. ? ??//AuthComponent を設定します
  5. ??$this->Auth->authorize = 'アクション';
  6. ??$this->Auth->loginAction = array('controller' =>'users', 'action' => 'login');
  7. ??$this->Auth->logoutRedirect = array('controller' =>'users', 'action' => 'login');
  8. ??$this->Auth->loginRedirect = array('controller' => 'posts', 'action' => 'add');
  9. ?}
  10. }
  11. ?>

次に、GroupsController と UsersController を変更する必要があります。これら 2 つのファイルのディレクトリがどこにあるかを知っておく必要があります。
これら 2 つのコントローラーのそれぞれに次のコードを追加します

  1. 関数 beforeFilter() {
  2. ? 親::beforeFilter();
  3. ? $this->Auth->allowedActions = array('*');

  4. }

実際、このコードの意味は、ユーザーがユーザーとグループの下のすべてのアクションにアクセスできるようにすることです。もちろん、これは後で元に戻す必要があります

。 次に、ACL テーブルを初期化する必要があります
なぜなら、今私たちのデータだからです。 ライブラリにはテーブルが 4 つしかなく、ACL テーブルはまだインポートされていません
次のステートメントを使用して、ACL テーブルをデータベースにインポートします
コマンドラインで Cake schema run create DbAcl

を入力します。 プロンプトに従ってテーブル

をインポートします 次に、ユーザーとグループのモデルを変更する必要があります
まず、model ディレクトリの user.php を開き、次のコードを追加します (実際には、次のコードに置き換えることができます)

  1. var $name = 'ユーザー';
  2. var $belongsTo = array('グループ');
  3. var $actsAs = array('Acl' => 'リクエスタ');

  4. 関数parentNode() {
  5. ? if (!$this->id && empty($this->data)) {
  6. ?????null を返します;
  7. ?}
  8. ? $data = $this->data;
  9. ? if (空($this->data)) {
  10. ??$data = $this->read();
  11. ?}
  12. ? if (!$data['User']['group_id']) {
  13. ?????null を返します;
  14. } 他に {
  15. ?????return array('Group' => array('id' => $data['User']['group_id']);
  16. ?}
  17. }
コードをコピー

次に、グループ モデルを変更します

  1. var $actsAs = array('Acl' => array('requester'));

  2. 関数parentNode() {
  3. ? 戻り値 null;
  4. }

良いです さて、このステップで一時的に停止する必要があります。次に、ブラウザで対応するユーザーとグループのページを開き、ユーザーとグループを追加します。たとえば、「私は開きます」とします。 http://localhost/cakephp/groupsグループを追加して http://localhost/cakephp/users/ を開きます ユーザーを追加します。ここでは 3 つのグループと 3 人のユーザーを追加します

追加した後、phpmyadmin を開いて aros テーブルを調べ、さらにレコードがあるかどうかを確認できます

すごいと思いませんか? (笑)、これがこのフレームワークの魅力です。これまでのところ、acl に関連する唯一のテーブルは aros テーブル

にあります。 今後各ユーザーを変更するときは、aros テーブル レコードも変更する必要があります
次のコードをユーザー モデルに追加するだけです

  1. /**? ?
  2. * コールバック保存後
  3. *
  4. * ユーザーの aro を更新します。
  5. *
  6. * @access public
  7. * @return void
  8. */
  9. 関数 afterSave($created) {
  10. ?????if (!$created) {
  11. ? ?? ?$parent = $this->parentNode();
  12. ?? ?? ?$parent = $this->node($parent);
  13. ?? ?? $node = $this->node();
  14. ? ?? ?$node[0];
  15. ? ?? ?$aro['Aro']['parent_id'] = $parent[0]['Aro']['id'];
  16. ?? ?? ?$this->Aro->save($aro);
  17. ????}
  18. }

この時点で aro の作成は完了しました。今度は、より良い aco を作成する必要があります
acl の本質は、ARO がいつ aco コンポーネントにアクセスできるかを定義することであることを理解しておくと、すべてが非常に簡単になります。
簡単にするために、コマンドラインを使用してcake acl create aco rootcontrollers

を実行します。 ここで phpmyadmin を使用して acors テーブルを開くと、このコマンドを実行した結果として既にレコードが存在していることがわかります。もちろん、コマンド ライン ツールを使用する必要はありません。

次に、AppController 内の beforeFilter メソッドに $this->Auth->actionPath = 'controllers/';

という行を追加する必要があります。 以下が重要なポイントです。アプリ プロジェクトには多くのコントローラーとメソッドが存在する可能性があります。もちろん、トラブルを恐れない場合は、各アクションを acors テーブルに追加する必要があります。一つずつですが、ほとんどのプログラマーはまだ非常に怠け者だと思うので、自動生成ツールを使用する必要があります

ここでは次のコードを追加して users_controller.php に配置します。 もちろん、他のコントローラーに配置することもできます
次に、次のコードを users_controller.php

に追加します。

  1. 関数 build_acl() {
  2. ? ?? ?? ?? ?? ? if (!Configure::read('debug')) {
  3. ? ?? ?? ?? ?? ?? ?? ?? ?return $this->_stop();
  4. ? ?? ?? ?? ?? ? }
  5. ? ?? ?? ?? ?? ? $log = array();

  6. ? ?? ?? ?? ?? ? $aco =& $this->Acl->Aco;
  7. ? ?? ?? ?? ?? ? $root = $aco->node('コントローラー');
  8. ? ?? ?? ?? ?? ? if (!$root) {
  9. ? ?? ?? ?? ?? ?? ?? ?? ?$aco->create(array('parent_id' => null, 'model' => null, 'alias' => 'controllers'));
  10. ? ?? ?? ?? ?? ?? ?? ?? ?$root = $aco->save();
  11. ? ?? ?? ?? ?? ?? ?? ?? ?$root['Aco']['id'] = $aco->id;
  12. ? ?? ?? ?? ?? ?? ?? ?? ?$log[] = 'コントローラー用の Aco ノードを作成しました';
  13. ? ?? ?? ?? ?? ? } else {
  14. ? ?? ?? ?? ?? ?? ?? ?? ?$root = $root[0];
  15. ? ?? ?? ?? ?? ? }? ?

  16. ? ?? ?? ?? ?? ? App::import('コア', 'ファイル');
  17. ? ?? ?? ?? ?? ? $Controllers = Configure::listObjects('controller');
  18. ? ?? ?? ?? ?? ? $appIndex = array_search('App', $Controllers);
  19. ? ?? ?? ?? ?? ? if ($appIndex !== false ) {
  20. ? ?? ?? ?? ?? ?? ?? ?? ?unset($Controllers[$appIndex]);
  21. ? ?? ?? ?? ?? ? }
  22. ? ?? ?? ?? ?? ? $baseMethods = get_class_methods('コントローラー');
  23. ? ?? ?? ?? ?? ? $baseMethods[] = 'buildAcl';

  24. ? ?? ?? ?? ?? ? $Plugins = $this->_getPluginControllerNames();
  25. ? ?? ?? ?? ?? ? $Controllers = array_merge($Controllers, $Plugins);

  26. ? ?? ?? ?? ?? ? // app/controllers 内の各コントローラーを確認します
  27. ? ?? ?? ?? ?? ? foreach ($Controllers as $ctrlName) {
  28. ? ?? ?? ?? ?? ?? ?? ?? ?$methods = $this->_getClassMethods($this->_getPluginControllerPath($ctrlName));

  29. ? ?? ?? ?? ?? ?? ?? ?? ?// すべてのプラグインを最初に実行します
  30. ? ?? ?? ?? ?? ?? ?? ?? ?if ($this->_isPlugin($ctrlName)){
  31. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$pluginNode = $aco->node('controllers/'.$this->_getPluginName($ctrlName));
  32. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???if (!$pluginNode) {
  33. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $aco->create(array('parent_id' => $root['Aco']['id'], 'model' => null, 'エイリアス' => $this->_getPluginName($ctrlName)));
  34. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $pluginNode = $aco->save();
  35. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $pluginNode['Aco']['id'] = $aco->id;
  36. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $log[] = ' の Aco ノードを作成しました。 $this->_getPluginName($ctrlName) 。 ' プラグイン';
  37. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
  38. ? ?? ?? ?? ?? ?? ?? ?? ?}
  39. ? ?? ?? ?? ?? ?? ?? ?? ?// コントローラー ノードを検索 / 作成
  40. ? ?? ?? ?? ?? ?? ?? ?? ?$controllerNode = $aco->node('controllers/'.$ctrlName);
  41. ? ?? ?? ?? ?? ?? ?? ?? ?if (!$controllerNode) {
  42. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???if ($this->_isPlugin($ctrlName)){
  43. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $pluginNode = $aco->node('controllers/' . $this->_getPluginName($ctrlName));
  44. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $aco->create(array('parent_id' => $pluginNode['0']['Aco']['id'], 'モデル' => null, 'エイリアス' => $this->_getPluginControllerName($ctrlName)));
  45. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $controllerNode = $aco->save();
  46. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $controllerNode['Aco']['id'] = $aco->id;
  47. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $log[] = 'Aco を作成しました ' のノード。 $this->_getPluginControllerName($ctrlName) 。 「 」。 $this->_getPluginName($ctrlName) 。 ' プラグイン コントローラー';
  48. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???} else {
  49. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $aco->create(array('parent_id' => $root['Aco']['id'], 'model' => null, 'エイリアス' => $ctrlName));
  50. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $controllerNode = $aco->save();
  51. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $controllerNode['Aco']['id'] = $aco->id;
  52. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $log[] = ' の Aco ノードを作成しました。 $ctrlName;
  53. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
  54. ? ?? ?? ?? ?? ?? ?? ?? ?} else {
  55. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$controllerNode = $controllerNode[0];
  56. ? ?? ?? ?? ?? ?? ?? ?? ?}

  57. ? ?? ?? ?? ?? ?? ?? ?? ?//メソッドをクリーンアップします。コントローラーとプライベートアクション内のそれらを削除します。
  58. ? ?? ?? ?? ?? ?? ?? ?? ?foreach ($methods as $k => $method) {
  59. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???if (strpos($method, '_', 0) === 0) {
  60. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? unset($methods[$k]);
  61. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?続行;
  62. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
  63. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???if (in_array($method, $baseMethods)) {
  64. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? unset($methods[$k]);
  65. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?続行;
  66. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
  67. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$methodNode = $aco->node('controllers/'.$ctrlName.'/'.$method);
  68. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???if (!$methodNode) {
  69. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $aco->create(array('parent_id' => $controllerNode['Aco']['id'], 'モデル' => null, 'エイリアス' => $method));
  70. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $methodNode = $aco->save();
  71. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? $log[] = ' の Aco ノードを作成しました。 $メソッド;
  72. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
  73. ? ?? ?? ?? ?? ?? ?? ?? ?}
  74. ? ?? ?? ?? ?? ? }
  75. ? ?? ?? ?? ?? ? if(count($log)>0) {
  76. ? ?? ?? ?? ?? ?? ?? ?? ?debug($log);
  77. ? ?? ?? ?? ?? ? }
  78. ? ?? ???}

  79. ? ?? ???function _getClassMethods($ctrlName = null) {
  80. ? ?? ?? ?? ?? ? App::import('コントローラー', $ctrlName);
  81. ? ?? ?? ?? ?? ? if (strlen(strstr($ctrlName, '.')) > 0) {
  82. ? ?? ?? ?? ?? ?? ?? ?? ?// プラグインのコントローラー
  83. ? ?? ?? ?? ?? ?? ?? ?? ?$num = strpos($ctrlName, '.');
  84. ? ?? ?? ?? ?? ?? ?? ?? ?$ctrlName = substr($ctrlName, $num+1);
  85. ? ?? ?? ?? ?? ? }
  86. ? ?? ?? ?? ?? ? $ctrlclass = $ctrlName 。 'コントローラー';
  87. ? ?? ?? ?? ?? ? $methods = get_class_methods($ctrlclass);

  88. ? ?? ?? ?? ?? ? // スキャフォールドが使用されている場合はスキャフォールドのデフォルトを追加しますsed
  89. ? ?? ?? ?? ?? ? $properties = get_class_vars($ctrlclass);
  90. ? ?? ?? ?? ?? ? if (array_key_exists('scaffold',$properties)) {
  91. ? ?? ?? ?? ?? ?? ?? ?? ?if($properties['scaffold'] == '管理者') {
  92. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$メソッド = array_merge($methods, array('admin_add', 'admin_edit', 'admin_index', 'admin_view', 'admin_delete'));
  93. ? ?? ?? ?? ?? ?? ?? ?? ?} else {
  94. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$methods = array_merge($methods, array('add', 'edit', 'index', 'view', 'delete'));
  95. ? ?? ?? ?? ?? ?? ?? ?? ?}
  96. ? ?? ?? ?? ?? ? }
  97. ? ?? ?? ?? ?? ? $methods を返す;
  98. ? ?? ???}

  99. ? ?? ???function _isPlugin($ctrlName = null) {
  100. ? ?? ?? ?? ?? ? $arr = String::tokenize($ctrlName, '/');
  101. ? ?? ?? ?? ?? ? if (count($arr) > 1) {
  102. ? ?? ?? ?? ?? ?? ?? ?? ?true を返す;
  103. ? ?? ?? ?? ?? ? } else {
  104. ? ?? ?? ?? ?? ?? ?? ?? ?return false;
  105. ? ?? ?? ?? ?? ? }
  106. ? ?? ???}

  107. ? ?? ???function _getPluginControllerPath($ctrlName = null) {
  108. ? ?? ?? ?? ?? ? $arr = String::tokenize($ctrlName, '/');
  109. ? ?? ?? ?? ?? ? if (count($arr) == 2) {
  110. ? ?? ?? ?? ?? ?? ?? ?? ?return $arr[0] 。 「。」 。 $arr[1];
  111. ? ?? ?? ?? ?? ? } else {
  112. ? ?? ?? ?? ?? ?? ?? ?? ?return $arr[0];
  113. ? ?? ?? ?? ?? ? }
  114. ? ?? ???}

  115. ? ?? ???function _getPluginName($ctrlName = null) {
  116. ? ?? ?? ?? ?? ? $arr = String::tokenize($ctrlName, '/');
  117. ? ?? ?? ?? ?? ? if (count($arr) == 2) {
  118. ? ?? ?? ?? ?? ?? ?? ?? ?return $arr[0];
  119. ? ?? ?? ?? ?? ? } else {
  120. ? ?? ?? ?? ?? ?? ?? ?? ?return false;
  121. ? ?? ?? ?? ?? ? }
  122. ? ?? ???}

  123. ? ?? ???function _getPluginControllerName($ctrlName = null) {
  124. ? ?? ?? ?? ?? ? $arr = String::tokenize($ctrlName, '/');
  125. ? ?? ?? ?? ?? ? if (count($arr) == 2) {
  126. ? ?? ?? ?? ?? ?? ?? ?? ?return $arr[1];
  127. ? ?? ?? ?? ?? ? } else {
  128. ? ?? ?? ?? ?? ?? ?? ?? ?return false;
  129. ? ?? ?? ?? ?? ? }
  130. ? ?? ???}

  131. /**
  132. * プラグイン コントローラーの名前を取得します ...
  133. *
  134. * この関数はプラグイン コントローラー名の配列を取得します。
  135. * また、
    を取得するためにコントローラーが利用可能であることも確認します。
  136. * 各プラグイン コントローラーに対して App::import を実行することによるメソッド名。
  137. *
  138. * @return プラグイン名の配列。
  139. *
  140. */
  141. ? ?? ???function _getPluginControllerNames() {
  142. ? ?? ?? ?? ?? ? App::import('コア', 'ファイル', 'フォルダー');
  143. ? ?? ?? ?? ?? ? $paths = 構成::getInstance();
  144. ? ?? ?? ?? ?? ? $folder =& 新しいフォルダー();
  145. ? ?? ?? ?? ?? ? $folder->cd(APP . 'plugins');

  146. ? ?? ?? ?? ?? ? // プラグインのリストを取得します
  147. ? ?? ?? ?? ?? ? $Plugins = $folder->read();
  148. ? ?? ?? ?? ?? ? $Plugins = $Plugins[0];
  149. ? ?? ?? ?? ?? ? $arr = array();

  150. ? ?? ?? ?? ?? ? // プラグインをループします
  151. ? ?? ?? ?? ?? ? foreach($Plugins as $pluginName) {
  152. ? ?? ?? ?? ?? ?? ?? ?? ?// ディレクトリをプラグインに変更します
  153. ? ?? ?? ?? ?? ?? ?? ?? ?$didCD = $folder->cd(APP . 'plugins'. DS . $pluginName . DS . 'controllers');
  154. ? ?? ?? ?? ?? ?? ?? ?? ?// ファイル名が
    で終わるファイルのリストを取得します。
  155. ? ?? ?? ?? ?? ?? ?? ?? ?//controller.php
    を使用
  156. ? ?? ?? ?? ?? ?? ?? ?? ?$files = $folder->findRecursive('.*_controller.php');

  157. ? ?? ?? ?? ?? ?? ?? ?? ?// プラグイン ディレクトリで見つかったコントローラーをループします
  158. ? ?? ?? ?? ?? ?? ?? ?? ?foreach($files as $fileName) {
  159. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???// ベースファイル名を取得します
  160. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$file = ベース名($fileName);

  161. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???// コントローラー名を取得します
  162. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$file = Inflector::camelize(substr($file, 0, strlen($file)-strlen('_controller.php')));
  163. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???if (!preg_match('/^'.Inflector::humanize($pluginName).'App/', $file)) {
  164. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? if (!App::import('Controller', $pluginName.'.'.$file)) {
  165. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?debug('プラグイン '.$pluginName の '.$file.' インポート中にエラーが発生しました);
  166. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? } else {
  167. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?/// プラグイン名を先頭に追加します ...
  168. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?// これはメソッド名を取得できるようにするために必要です。
  169. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?$arr[] = Inflector::humanize($pluginName) 。 「/」。 $file;
  170. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? }
  171. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
  172. ? ?? ?? ?? ?? ?? ?? ?? ?}
  173. ? ?? ?? ?? ?? ? }
  174. ? ?? ?? ?? ?? ? $arr を返す;
  175. ? ?? ???}

增加好以后我们打开浏览器访问刚才的方法
比如我的http://localhost/cakephp/users/build_acl
実行後のプログラムは、すべてのコントローラーのアクションをすべて acos テーブルに自動的に追加します。


など、acos テーブルの起動時に確認できます。 次来应该是做我们最兴奋的事情了,就是实现权制限制御,故我们前期標準备工作都做好了,最终我们都是了实现可制御权制限

1.? ?? ???先来介绍下语法,允许访问$this->Acl->allow($aroAlias, $acoAlias);
廝访问$this->Acl->deny($aroAlias, $acoAlias);

先は aros_acos 表中見下、今まではこの表を停止しています、これは承認されていません
我们可写一初期化関数
我同样把この段代网在ユーザー制御器中

  1. 関数 initDB() {
  2. ? ? $group =& $this->ユーザー->グループ;
  3. ? ? //管理者にすべてを許可します
  4. ? ? $group->id = 1;? ???
  5. ? ? $this->Acl->allow($group, 'controllers');

  6. ? ? // 管理者に投稿とウィジェットを許可します
  7. ? ? $group->id = 2;
  8. ? ? $this->Acl->deny($group, 'controllers');
  9. ? ? $this->Acl->allow($group, 'controllers/Posts');
  10. ? ? $this->Acl->allow($group, 'コントローラー/ウィジェット');

  11. ? ? //ユーザーに投稿とウィジェットの追加と編集のみを許可します
  12. ? ? $group->id = 3;
  13. ? ? $this->Acl->deny($group, 'controllers');? ?? ???
  14. ? ? $this->Acl->allow($group, 'controllers/Posts/add');
  15. ? ? $this->Acl->allow($group, 'controllers/Posts/edit');? ?? ???
  16. ? ? $this->Acl->allow($group, 'controllers/Widgets/add');
  17. ? ? $this->Acl->allow($group, 'controllers/Widgets/edit');
  18. }

次来我们在浏览器中访问この行動

これは時間です你就应该発行现你的 aros_acos 表中多了很多条记录,哈哈,これは acl の秘密の場所です。

次に、異なるグループのユーザー名登録を使用することもできますし、initDB エリアのコードを変更してテストを行うこともできます。これは、実際の作業でどのように使用するかについて、那就要見你自己的了、最後祝大家工作愉快!这在这里,有兴趣的朋友可下載 cakephp中acl详解.rar

转下自: バッテリーラップトップ

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。