CakePHP3チュートリアルの「Restricting Bookmark Access」実装後のページアクセス制限について

f:id:saj_kz:20150215190732p:plain
最近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() から呼ばれているようですので、興味があれば見てみてください。