CakePHP3チュートリアルの「Restricting Bookmark Access」実装後のページアクセス制限について
最近RC2も出て、そろそろいじってみようかな?といったタイミングでしたので、CakePHP3のBoomarkerTutorialをやってます。
チュートリアルのパート2にて、ログイン、ログアウトの実装後に、ログイン状態によって特定のページ以外へのアクセスを制限する「Restricting Bookmark Access」の項があります。
ここで、AppControllerに対して
public function isAuthorized($user) { return false; }
の追加と、
public function initialize() { ... $this->loadComponent('Auth', [ 'authorize'=> 'Controller', ...
の設定を行っていますが、これにより全てのControllerにてページへのアクセスが制限されてしまいます。
チュートリアル内では、BookmarksController.php の isAuthorized() を実装して、ログイン状態によってブックマークページへのアクセスを行えるようにしていますが、ユーザ一覧ページ (http://対象サーバ/users)等のブックマーク以外のページはアクセスできないままなので、他のControllerにも、isAuthorized() を実装してみました。
UsersController
ファイルの場所 : /src/Controller/UsersController.php
public function isAuthorized($user) { $action = $this->request->params['action']; // index, add, login, logoutページは誰でも見れる if (in_array($action, ['index', 'add', 'login', 'logout'])) { return true; } // All other actions require an id. if (empty($this->request->params['pass'][0])) { return false; } // リクエストされたページのUser idと // ログイン中のUser idが一致する場合はその他のアクションも許可する $id = $this->request->params['pass'][0]; $current_user = $this->Users->get($id); if ($current_user->id == $user['id']) { return true; } return parent::isAuthorized($user); }
TagsController
ファイルの場所 : /src/Controller/TagsController.php
public function isAuthorized($user) { $action = $this->request->params['action']; // 想定される全てのページへのアクセスを許可する if (in_array($action, ['index', 'add', 'edit', 'view', 'delete'])) { return true; } return parent::isAuthorized($user); }
これで、ユーザ、タグページの各種操作は問題なく行えます。
ちなみにisAuthorized() の処理は、
/vendor/cakephp/cakephp/src/Auth/ControllerAuthorize.php
の authorize() から呼ばれているようですので、興味があれば見てみてください。