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