【CakePHP】ACL - アクセス制御リストを使う
-
カテゴリ:
- PHP
-
タグ:
- #CakePHP
CakePHPで認証処理やアクセス制御でお世話になる「Authコンポーネント」。
ログイン画面など作成する際、とても簡単に機能を提供してくれてとても便利ですが、
既存のままでは利用者がログインしているのかしていないのかを教えてくれるだけで、
画面ごとのアクセス制御をしたい場合は不十分です。
そんな時に便利なのが「ACL - アクセス制御リスト」です。
ACLでユーザごとのアクセス制御をする方法として、データベースを使う方法と
ファイルを使う方法の2通りがありますが、今回は「acl.ini.php」ファイルを
使った方法をご紹介します。
対応バージョンはCakePHP1.3です。
ACLの構成要素
ACLはAROとACO、ACO_AROの3つで成り立っています。
各説明としては以下の通り。
- ARO:ユーザ、ユーザを一括りにまとめたグループ
例)ログインユーザ - ACO:対象物、ページ
例)コントローラのアクション、ビュー - ARO_ACO:ACOとAROの間の関連を示したもの
(※今回acl.ini.phpでは登場しません。多分。)
acl.ini.phpの設定
ACLの設定をするため、「acl.ini.php」ファイルを作成します。
作成する場所は「/[プロジェクトのトップフォルダ]/config/」の直下でOKです。
アクセス制御リストのサンプルを作成しました。
書き方としては[ARO]というように、括弧の中に対象のAROを記載します。
「groups」で権限の制御をしたいグループの定義と名前を設定している。
「allow」で上記で設定したグループに対して、アクセス可能な画面のアクション
や相対パス(ACO)などを設定している。
;-------------------------------------
; ユーザとグループの定義
; [ARO]
; groups = ARO,・・・(カンマ区切りで複数のACOを設定可)
;-------------------------------------
;管理者
[1]
groups = common-group, admin
[2]
groups = common-group, admin
[3]
groups = common-group, admin
;作業者
[4]
groups = common-group, operator
;その他
[9]
groups = common-group, other
;-------------------------------------
; グループに対してACOを定義
; [ARO]
; allow = ACO,・・・ (アクセスを許可する場合)
; deny = ACO,・・・ (アクセスを拒否する場合)
;-------------------------------------
;管理者
[admin]
allow = Lists, Menus, Details, Masters, Setttings
;作業者
[operator]
allow = Lists, Menus, Details
deny = Masters, Setttings
;その他
[other]
allow = Lists, Menus
deny = Details, Masters, Setttings
; 共通設定
[common-group]
allow = Logins, Pages, Logouts
サンプルソース
acl.ini.phpを作成したら、実際にCakePHPの制御部分を作成します。
今回はサンプルとしてapp_controller.phpのbeforeFilter()でログイン認証をし、
isAuthorized()でアクセス制御をする例です。
class AppController extends Controller {
var $components = array('Auth', 'Session', 'Acl');
var $helpers = array('Session', 'Html', 'Form', 'Js'=>array('jquery'));
function beforeFilter() {
// ログイン認証処理
$this->Auth->authenticate = ClassRegistry::init('Users');
$this->Auth->authorize = 'controller';
$this->Auth->userModel = 'Users';
$this->Auth->fields = array('username' => 'code', 'password' => 'password');
$this->Auth->loginAction = array('controller' => 'logins', 'action' => 'index', 'admin' => false);
$this->Auth->autoRedirect = false;
Security::setHash('sha256');
}
function isAuthorized() {
$aro = $this->Auth->user('role_id');
$aco = $this->name;
$ret = false;
// アクセス可能かチェック
$aco .= '/' . $this->action;
if ($this->Acl->check($aro, $aco)) {
// ・・・ アクセスが許可された際の処理
} else {
// ・・・ アクセスが拒否された際の処理
}
return $ret;
}
}
「$this->Acl->check($aro, $aco);」で引数で渡したACOに対して、AROが含まれるかチェックしている。
上記のチェックではじかれ場合は、権限エラー画面へリダイレクトさせるなどしましょう。