ACL:ファイル側 $this->Auth->authorize の設定は?
ACL入れようとしてますが、最後の(?)詰め、Controller側の設定でハマってます・・・
検討&調査中のメモ。
(追記:解消しました。 解は「action」あるいは「crud」です)
参考サイトで、
AppController に $this->Auth->authorize = 'actions'; と入れておきます。
とありますが、この方法だと、actionごとに全部aros_acos設定しなくてはならないようです。
controllerやModel単位でかけた設定だけでは、リダイレクトループのエラーになります。
アクション毎に全部ちゃんと設定いれようかなあ、と弱気になりつつ、$this->Auth->authorizeについて調査。
すると、例示に「modelを指定しなさい」的なことが書いてありました。*1
ACO を利用する時など、コントローラ中での処理を行わない場合はどうすればよいのでしょうか?その場合、 authorize 変数を「model」にセットすることで、認証が使うモデル(例えば User) 中の isAuthorized() メソッドがコールされます。
http://book.cakephp.org/ja/view/396/authorize
でも、追加するisAuthorized() メソッド例の、引数はそれぞれ何をいれれば・・・?
cake/libs/auth.phpで、実際にisAuthorized()を確認。
するとまず、$this->Auth->authorize = 'actions';の指定でACLチェックが入る道理がわかりました。
case 'actions': $valid = $this->Acl->check($user, $this->action()); break;
では肝心のmodel指定。
case 'model': $this->mapActions(); $action = $this->params['action']; if (isset($this->actionMap[$action])) { $action = $this->actionMap[$action]; } if (is_string($object)) { $object = $this->getModel($object); } (中略) if (method_exists($object, 'isAuthorized')) { $valid = $object->isAuthorized($user, $this->action(':controller'), $action);
なるほどでは、モデルに追加したisAuthorizedの中で、$this->Acl->check()の結果でも返せばよさそう。
持ってる本によると、$this->Acl->check()でACLの設定チェックが・・・・・・・・
と思って、
ハタと気がつきました。
case 'model' の上に・・・・
case 'crud': $this->mapActions(); if (!isset($this->actionMap[$this->params['action']])) { $err = 'Auth::startup() - Attempted access of un-mapped action "%1$s" in'; $err .= ' controller "%2$s"'; trigger_error( sprintf(__($err, true), $this->params['action'], $this->params['controller']), E_USER_WARNING ); } else { $valid = $this->Acl->check( $user, $this->action(':controller'), $this->actionMap[$this->params['action']] ); } break;
CRUDとは (Create, Read, Update, Delete) クラッド: - IT用語辞典バイナリ
これじゃんっ!!(゚ロ゚;)
さらに、$this->actionMap というのが何物か調べてみると。
var $actionMap = array( 'index' => 'read', 'add' => 'create', 'edit' => 'update', 'view' => 'read', 'remove' => 'delete' );
・・・・・・・・・・
アクション名を、crudに変換するための、マッピングかーーーー!(゚ロ゚;)
と、
いうことは。
よし・・・できる!!
と、思うのです。
ModelでAclを参照さえきれば。。。
それともauthにいれて、crudが正解・・・?
(追記:ModelからAclを参照するのが厄介。ACLは認証関連なのだし、crud設定してAuth拡張で間違ってないのでは)
*1:追記:これに惑わされました T_T