CakePHP ACLデータベースの設定:ARO/ACO構造ですか?
-
09-06-2019 - |
質問
どうしたらいいのかと悩んをACLにCakePHP.後の読み込み書類の ケーキマニュアル など複数のチュートリアル、ブログ投稿など、アラン博nasaジョンソンの優れたチュートリアルをたく多くのギャップがあります。彼の事例に見る紛争とその他の見所が数箇所具体的には、AROのツリー構造った。
彼の 例 彼のユーザーグループにおいてカスケードツリーのほとんどの一般的なユーザータイプのトップツリーの、その子が分岐毎よりアクセスが制限されたタイプです。なんのものがあることが知られている各ユーザータイプの子として同じ一般ユーザータイプです。
設定方法おAROs、ACOsにCakePHP?他のすべてのヒントをお願いいたします。
解決
CakePHPのACLシステムは本当に強い力が低記録の実施。システムを使用していますと、一定の成果のCakePHPベースプロジェクトには以下の通りです。
この変更一部のグループレベルのアクセスシステム 文書化した他の.当社のシステムることを目的としてシンプルなシステムがユーザーに許可されているグループレベルのものでは特定の追加の権利を目されている、またはユーザーごとにベース。またる必要性を回避するために作成特定のエントリの各ユーザーは、より具体的には、各ARO)の aros_acos
表に示す。
いユーザーにテーブルの役割はます。
ユーザー
user_id, user_name, role_id
役割
id, role_name
をAROツリーの各役割については、4つの役割-不正なゲスト(id1)、認可されたユーザid2),サイトのモデレーター(id3)管理者idの4)):
cake acl create aro / Role.1
cake acl create aro 1 Role.2 ... etc ...
この後、ご利用のSQLはphpMyAdmin等により、エイリアスの追加については、それぞれのケーキのコマンドラインツールがないのである。ての役割-{id}"と"ユーザーを{id}"のすべてまいります。
ましてルートACO-
cake acl create aco / 'ROOT'
を作成して,すべてのコントローラーはこのルートワン:
cake acl create aco 'ROOT' 'MyController' ... etc ...
ところ正常です。を追加しました追加の分野にaros_acosテーブルと呼ばれ _editown
できるとしてご利用追加のACLのコンポーネントのactionMap.
CREATE TABLE IF NOT EXISTS `aros_acos` (
`id` int(11) NOT NULL auto_increment,
`aro_id` int(11) default NULL,
`aco_id` int(11) default NULL,
`_create` int(11) NOT NULL default '0',
`_read` int(11) NOT NULL default '0',
`_update` int(11) NOT NULL default '0',
`_delete` int(11) NOT NULL default '0',
`_editown` int(11) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `acl` (`aro_id`,`aco_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
その上で、いまの設定Authを使のcrudの方法は、検証の要求コントローラー/アクションに対してAclComponent::チェックイン().のapp_controllerいう、日:
private function setupAuth() {
if(isset($this->Auth)) {
....
$this->Auth->authorize = 'crud';
$this->Auth->actionMap = array( 'index' => 'read',
'add' => 'create',
'edit' => 'update'
'editMine' => 'editown',
'view' => 'read'
... etc ...
);
... etc ...
}
}
これはかなりの標準CakePHP。またメソッドの場合はcheckAccess法のAppControllerの追加、グループレベルのものをチェックチェックするかどうかのグループARO、またはユーザーのAROのためのアクセス:
private function checkAccess() {
if(!$user = $this->Auth->user()) {
$role_alias = 'Role-1';
$user_alias = null;
} else {
$role_alias = 'Role-' . $user['User']['role_id'];
$user_alias = 'User-' . $user['User']['id'];
}
// do we have an aro for this user?
if($user_alias && ($user_aro = $this->User->Aro->findByAlias($user_alias))) {
$aro_alias = $user_alias;
} else {
$aro_alias = $role_alias;
}
if ('editown' == $this->Auth->actionMap[$this->action]) {
if($this->Acl->check($aro_alias, $this->name, 'editown') and $this->isMine()) {
$this->Auth->allow();
} else {
$this->Auth->authorize = 'controller';
$this->Auth->deny('*');
}
} else {
// check this user-level aro for access
if($this->Acl->check($aro_alias, $this->name, $this->Auth->actionMap[$this->action])) {
$this->Auth->allow();
} else {
$this->Auth->authorize = 'controller';
$this->Auth->deny('*');
}
}
}
の setupAuth()
や checkAccess()
メソッド呼び出されるの AppController
's beforeFilter(
)コールバック.あり isMine
方法のAppControlerもの(下記参照)をチェックすることuser_idのご希望の場合と同じです現在の認証されたユーザーです。私はこれらのプロセスを透明度
ほとんどすべてがあります。その拒否における特定の集団へのアクセスの特定のacos-
cake acl grant 'Role-2' 'MyController' 'read'
cake acl grant 'Role-2' 'MyController' 'editown'
cake acl deny 'Role-2' 'MyController' 'update'
cake acl deny 'Role-2' 'MyController' 'delete'
ていらっしゃることだと思いますを取得します。
とにかく、この答え方なんです、でもこんなあなたにとってどんな年でした手伝いはしてお---
--編集--
るとともに、要求があればこちらの編集(純粋に機能再構成に成功しました。りのコミュニケーションも楽しみのも当社の定型コードの意味がない。 isMine()
方法として弊社のAppController.私は削除され多くのエラーチェックももこの本質で
function isMine($model=null, $id=null, $usermodel='User', $foreignkey='user_id') {
if(empty($model)) {
// default model is first item in $this->uses array
$model = $this->uses[0];
}
if(empty($id)) {
if(!empty($this->passedArgs['id'])) {
$id = $this->passedArgs['id'];
} elseif(!empty($this->passedArgs[0])) {
$id = $this->passedArgs[0];
}
}
if(is_array($id)) {
foreach($id as $i) {
if(!$this->_isMine($model, $i, $usermodel, $foreignkey)) {
return false;
}
}
return true;
}
return $this->_isMine($model, $id, $usermodel, $foreignkey);
}
function _isMine($model, $id, $usermodel='User', $foreignkey='user_id') {
$user = Configure::read('curr.loggedinuser'); // this is set in the UsersController on successful login
if(isset($this->$model)) {
$model = $this->$model;
} else {
$model = ClassRegistry::init($model);
}
//read model
if(!($record = $model->read(null, $id))) {
return false;
}
//get foreign key
if($usermodel == $model->alias) {
if($record[$model->alias][$model->primaryKey] == $user['User']['id']) {
return true;
}
} elseif($record[$model->alias][$foreignkey] == $user['User']['id']) {
return true;
}
return false;
}