メモ書き
認証(Auth)とACL(Access Controll List)がかなり絡んでるので混乱してきたのでメモ書き
書いてる最中も頭爆発しそうなのと、半分混乱しながらなので当てにはしないでください。
CakePHP2.4.10の話です。
気が向いたら、覚えていたら、書き込んでいく形。
ACL の aco, aro
- aco = Access Control Object
- aro = Access Request Object
ACO によりアクセスコントロールの許可/不許可判断をして、 ARO でアクセスの許可/不許可の表を作っている形。
認証と深く関わっているため、AuthComponentから利用する形になっている。
ACLの設定とか
Configure::write('Acl.classname', 'PhpAcl');
// Configure::write('Acl.database', 'default');
Acl.classname: Acl を使う時に利用するクラス名。 DbAcl
,IniAcl
,PhpAcl
もしくは独自作成のAclクラス名。
Acl.database: Acl.classname で指定したクラスがDBを使う時に設定する。使わない時は、空白文字を入れるのではなく、意図的にコメントアウトした方がいい
Auth の使い方
認証周り。
class AppController extends Controller {
public $components = [
'Acl',
'Session',
'Auth' => [
'loginAction' => ['controller' => 'users', 'action' => 'login'],
'logoutRedirect' => ['controller' => 'users', 'action' => 'login'],
'loginRedirect' => ['controller' => 'posts', 'action' => 'add'],
// Acl で必要な設定
'authorize' => [
'Actions' => ['actionPath' => 'controllers']
]
],
];
public $helpers = ['Html', 'Form', 'Session'];
/**
* Action が呼び出される前に実行される。
*/
public function beforeFilter() {
parent::beforeFilter();
// For CakePHP 2.0
$this->Auth->allow('*');
// For CakePHP 2.1 and up
$this->Auth->allow();
}
}
AuthComponent
Auth.authorize の値により、ACLの関わり方が変わってくる。
class AppController extends Controller {
public $components = [
'Auth' => [
// Acl で必要な設定
'authorize' => [
'Actions' => ['actionPath' => 'controllers']
],..
],
];
}
認証を終えた後、それぞれのコントローラアクションにて、authorize
の値により認証後の認可が変わる。
Auth.authorizeが取りうる値
- Actions : ACLComponentを使ってAction単位でチェックする。対応表はDBのを利用するっぽい?
- Crud : Action と CRUDの表からチェックをする。コントローラー毎に設定する形になるっぽい。
- Controller :
isAuthorized($user)
メソッドをControllerに投げて、返り値をみてチェックする
Auth.authorize の独自拡張
LDAPなどを使用したい場合は下記のように、クラスを拡張する必要がある。
class LdapAuthorize extends BaseAuthorize {
public function authorize($user, CakeRequest $request) {
// Do things for ldap here.
}
}
false を返せばアクセスの認可を拒否できる。そして、下記のように追加してやれば、独自拡張したクラスを使用することができる。
class AppController extends Controller {
public $components = [
'Auth' => [
// Acl で必要な設定
'authorize' => [
'Ldap',
],..
],
];
}
CrudAuthorize の使い方
コントローラー毎に設定する必要がある。
多分こんな感じ。
検証してないので要注意
class AppController extends Controller {
public $components = [
'Auth' => [
// Acl で必要な設定
'authorize' => [
'Crud',
],..
],
];
}
mapAction
の引数にある、keyはCRUD permissions
にあたり、値はアクションになる。
class AppController extends Controller {
public function beforeFilter () {
parent::beforeFilter();
$this->Auth->mapAction([
'create' => ['register'],
'view' => ['show', 'display']
]);
}
}
参考
- http://book.cakephp.org/2.0/en/tutorials-and-examples/simple-acl-controlled-application/simple-acl-controlled-application.html
- http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#authorization
- http://blog.milds.net/2012/11/cakephp.html
- http://hampom.wordpress.com/2012/11/24/cakephp%E3%81%AEacl%E3%82%92phpphpacl%E3%81%AB%E3%81%97%E3%81%A6%E7%AE%A1%E7%90%86%E3%81%8C%E3%83%A9%E3%82%AF%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E8%A9%B1/